// The Construct // // Copyright (C) The Construct Developers, Authors & Contributors // Copyright (C) 2016-2020 Jason Volk // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice is present in all copies. The // full license for this software is available in the LICENSE file. #pragma once #pragma clang system_header #define HAVE_IRCD_SPIRIT_BOOST_H // Disables asserts in spirit headers even when we're NDEBUG due to // some false asserts around boolean character tests in spirit. #define BOOST_DISABLE_ASSERTS // This prevents spirit grammar rules from generating a very large and/or deep // call-graph where rules compose together using wrapped indirect calls through // boost::function -- this is higly inefficient as the grammar's logic ends up // being a fraction of the generated code and the rest is invocation related // overhead. By force-flattening here we can allow each entry-point into // spirit to compose rules at once and eliminate the wrapping complex. #pragma clang attribute push ([[gnu::always_inline]], apply_to = function) #pragma clang attribute push ([[gnu::flatten]], apply_to = function) #include #include #pragma GCC visibility push (internal) // Spirit uses `boost::function` by default, but since it's in boost:: it // simply declares as `function`. We can do a lot better by dropping in // `std::function` instead. namespace boost::spirit { using std::function; } #include #include #include #include #include #include #include #include #include #include #include #pragma GCC visibility pop #pragma clang attribute pop #pragma clang attribute pop