From 648d6e42b43d68aff7e67314a6d9fafe84bd7579 Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Thu, 14 May 2020 16:29:53 -0700 Subject: [PATCH] ircd::json: Inline vector::const_iterator related. --- include/ircd/json/vector.h | 51 ++----------- include/ircd/json/vector_iterator.h | 108 ++++++++++++++++++++++++++++ ircd/json.cc | 47 ------------ 3 files changed, 114 insertions(+), 92 deletions(-) create mode 100644 include/ircd/json/vector_iterator.h diff --git a/include/ircd/json/vector.h b/include/ircd/json/vector.h index 6566af94b..c3f222cae 100644 --- a/include/ircd/json/vector.h +++ b/include/ircd/json/vector.h @@ -58,50 +58,11 @@ struct ircd::json::vector using string_view::string_view; }; -namespace ircd::json +#include "vector_iterator.h" + +inline ircd::json::vector::const_iterator +ircd::json::vector::end() +const { - bool operator==(const vector::const_iterator &, const vector::const_iterator &); - bool operator!=(const vector::const_iterator &, const vector::const_iterator &); - bool operator<=(const vector::const_iterator &, const vector::const_iterator &); - bool operator>=(const vector::const_iterator &, const vector::const_iterator &); - bool operator<(const vector::const_iterator &, const vector::const_iterator &); - bool operator>(const vector::const_iterator &, const vector::const_iterator &); + return { string_view::end(), string_view::end() }; } - -struct ircd::json::vector::const_iterator -{ - using value_type = const object; - using pointer = value_type *; - using reference = value_type &; - using iterator = const_iterator; - using size_type = size_t; - using difference_type = ptrdiff_t; - using iterator_category = std::forward_iterator_tag; - - protected: - friend class vector; - - const char *start {nullptr}; - const char *stop {nullptr}; - object state; - - const_iterator(const char *const &start, const char *const &stop) - :start{start} - ,stop{stop} - {} - - public: - value_type *operator->() const { return &state; } - value_type &operator*() const { return *operator->(); } - - const_iterator &operator++(); - - const_iterator() = default; - - friend bool operator==(const const_iterator &, const const_iterator &); - friend bool operator!=(const const_iterator &, const const_iterator &); - friend bool operator<=(const const_iterator &, const const_iterator &); - friend bool operator>=(const const_iterator &, const const_iterator &); - friend bool operator<(const const_iterator &, const const_iterator &); - friend bool operator>(const const_iterator &, const const_iterator &); -}; diff --git a/include/ircd/json/vector_iterator.h b/include/ircd/json/vector_iterator.h new file mode 100644 index 000000000..6b460ec81 --- /dev/null +++ b/include/ircd/json/vector_iterator.h @@ -0,0 +1,108 @@ +// Matrix Construct +// +// Copyright (C) Matrix Construct Developers, Authors & Contributors +// Copyright (C) 2016-2018 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_JSON_VECTOR_ITERATOR_H + +namespace ircd::json +{ + bool operator==(const vector::const_iterator &, const vector::const_iterator &); + bool operator!=(const vector::const_iterator &, const vector::const_iterator &); + bool operator<=(const vector::const_iterator &, const vector::const_iterator &); + bool operator>=(const vector::const_iterator &, const vector::const_iterator &); + bool operator<(const vector::const_iterator &, const vector::const_iterator &); + bool operator>(const vector::const_iterator &, const vector::const_iterator &); +} + +struct ircd::json::vector::const_iterator +{ + friend class vector; + + using value_type = const object; + using pointer = value_type *; + using reference = value_type &; + using iterator = const_iterator; + using size_type = size_t; + using difference_type = ptrdiff_t; + using iterator_category = std::forward_iterator_tag; + + const char *start {nullptr}; + const char *stop {nullptr}; + object state; + + const_iterator(const char *const &start, const char *const &stop) + :start{start} + ,stop{stop} + {} + + public: + value_type *operator->() const; + value_type &operator*() const; + + const_iterator &operator++(); + + const_iterator() = default; +}; + +inline ircd::json::vector::const_iterator::value_type & +ircd::json::vector::const_iterator::operator*() +const +{ + return *operator->(); +} + +inline ircd::json::vector::const_iterator::value_type * +ircd::json::vector::const_iterator::operator->() +const +{ + return &state; +} + +inline bool +ircd::json::operator==(const vector::const_iterator &a, + const vector::const_iterator &b) +{ + return a.start == b.start && a.state == b.state; +} + +inline bool +ircd::json::operator!=(const vector::const_iterator &a, + const vector::const_iterator &b) +{ + return a.start != b.start || a.state != b.state; +} + +inline bool +ircd::json::operator<=(const vector::const_iterator &a, + const vector::const_iterator &b) +{ + return a.start <= b.start && a.state == b.state; +} + +inline bool +ircd::json::operator>=(const vector::const_iterator &a, + const vector::const_iterator &b) +{ + return a.start >= b.start && a.state == b.state; +} + +inline bool +ircd::json::operator<(const vector::const_iterator &a, + const vector::const_iterator &b) +{ + return a.start < b.start && a.state == b.state; +} + +inline bool +ircd::json::operator>(const vector::const_iterator &a, + const vector::const_iterator &b) +{ + return a.start > b.start && a.state == b.state; +} diff --git a/ircd/json.cc b/ircd/json.cc index 28341d6de..bad1b0518 100644 --- a/ircd/json.cc +++ b/ircd/json.cc @@ -2393,53 +2393,6 @@ catch(const qi::expectation_failure &e) }; } -ircd::json::vector::const_iterator -ircd::json::vector::end() -const -{ - return { string_view::end(), string_view::end() }; -} - -// -// vector::const_iterator -// - -bool -ircd::json::operator==(const vector::const_iterator &a, const vector::const_iterator &b) -{ - return a.state == b.state; -} - -bool -ircd::json::operator!=(const vector::const_iterator &a, const vector::const_iterator &b) -{ - return a.state != b.state; -} - -bool -ircd::json::operator<=(const vector::const_iterator &a, const vector::const_iterator &b) -{ - return a.state <= b.state; -} - -bool -ircd::json::operator>=(const vector::const_iterator &a, const vector::const_iterator &b) -{ - return a.state >= b.state; -} - -bool -ircd::json::operator<(const vector::const_iterator &a, const vector::const_iterator &b) -{ - return a.state < b.state; -} - -bool -ircd::json::operator>(const vector::const_iterator &a, const vector::const_iterator &b) -{ - return a.state > b.state; -} - // // vector::const_iterator::const_iterator //