From c9ec0b3923d01f9bee120afe693596e849735ea0 Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Sat, 11 Jun 2022 18:25:31 -0700 Subject: [PATCH] ircd::spirit: Split substring_view into header. --- include/ircd/spirit.h | 1 + include/ircd/spirit/parse.h | 22 ------------ include/ircd/spirit/substring_view.h | 52 ++++++++++++++++++++++++++++ 3 files changed, 53 insertions(+), 22 deletions(-) create mode 100644 include/ircd/spirit/substring_view.h diff --git a/include/ircd/spirit.h b/include/ircd/spirit.h index dcd1e6b97..8e2230704 100644 --- a/include/ircd/spirit.h +++ b/include/ircd/spirit.h @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include diff --git a/include/ircd/spirit/parse.h b/include/ircd/spirit/parse.h index 562c3bd33..89d1e3c64 100644 --- a/include/ircd/spirit/parse.h +++ b/include/ircd/spirit/parse.h @@ -19,8 +19,6 @@ namespace ircd { namespace spirit __attribute__((visibility("internal"))) { - struct substring_view; - template bool parse(const char *&start, const char *const &stop, rule&&, attr&&...); @@ -36,26 +34,6 @@ __attribute__((visibility("internal"))) bool parse(std::nothrow_t, const char *&start, const char *const &stop, rule&&, attr&&...) noexcept; }} -struct [[clang::internal_linkage]] -ircd::spirit::substring_view -:ircd::string_view -{ - using _iterator = const char *; - using _iterator_range = boost::iterator_range<_iterator>; - using _indirect_iterator = karma::detail::indirect_iterator<_iterator>; - using _indirect_iterator_range = boost::iterator_range<_indirect_iterator>; - - explicit substring_view(const _iterator_range &range) - :ircd::string_view(std::addressof(*range.begin()), std::addressof(*range.end())) - {} - - explicit substring_view(const _indirect_iterator_range &range) - :ircd::string_view(std::addressof(*range.begin()), std::addressof(*range.end())) - {} - - using ircd::string_view::string_view; -}; - /// Execute the parse. The start pointer is advanced upon successful execution. /// Failures must not throw: If the grammar contains any epsilon expressions or /// callbacks which throw it is UB. This overload exists to force suppression diff --git a/include/ircd/spirit/substring_view.h b/include/ircd/spirit/substring_view.h new file mode 100644 index 000000000..95f987ef8 --- /dev/null +++ b/include/ircd/spirit/substring_view.h @@ -0,0 +1,52 @@ +// The Construct +// +// Copyright (C) The Construct Developers, Authors & Contributors +// Copyright (C) 2016-2022 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 +#define HAVE_IRCD_SPIRIT_SUBSTRING_VIEW_H + +// This file is not part of the IRCd standard include list (stdinc.h) because +// it involves extremely expensive boost headers for creating formal spirit +// grammars. This file is automatically included in the spirit.h group. + +namespace ircd::spirit +{ + struct substring_view; +} + +struct ircd::spirit::substring_view +:ircd::string_view +{ + using _iterator = const char *; + using _iterator_range = boost::iterator_range<_iterator>; + using _indirect_iterator = karma::detail::indirect_iterator<_iterator>; + using _indirect_iterator_range = boost::iterator_range<_indirect_iterator>; + + explicit substring_view(const _indirect_iterator_range &range); + explicit substring_view(const _iterator_range &range); + using ircd::string_view::string_view; +}; + +inline +ircd::spirit::substring_view::substring_view(const _iterator_range &range) +:ircd::string_view +{ + std::addressof(*range.begin()), + std::addressof(*range.end()) +} +{} + +inline +ircd::spirit::substring_view::substring_view(const _indirect_iterator_range &range) +:ircd::string_view +{ + std::addressof(*range.begin()), + std::addressof(*range.end()) +} +{}