// Copyright 2021 The Abseil Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef ABSL_STRINGS_INTERNAL_CORD_REP_BTREE_NAVIGATOR_H_ #define ABSL_STRINGS_INTERNAL_CORD_REP_BTREE_NAVIGATOR_H_ #include <cassert> #include <iostream> #include "absl/strings/internal/cord_internal.h" #include "absl/strings/internal/cord_rep_btree.h" namespace absl { ABSL_NAMESPACE_BEGIN namespace cord_internal { // CordRepBtreeNavigator is a bi-directional navigator allowing callers to // navigate all the (leaf) data edges in a CordRepBtree instance. // // A CordRepBtreeNavigator instance is by default empty. Callers initialize a // navigator instance by calling one of `InitFirst()`, `InitLast()` or // `InitOffset()`, which establishes a current position. Callers can then // navigate using the `Next`, `Previous`, `Skip` and `Seek` methods. // // The navigator instance does not take or adopt a reference on the provided // `tree` on any of the initialization calls. Callers are responsible for // guaranteeing the lifecycle of the provided tree. A navigator instance can // be reset to the empty state by calling `Reset`. // // A navigator only keeps positional state on the 'current data edge', it does // explicitly not keep any 'offset' state. The class does accept and return // offsets in the `Read()`, `Skip()` and 'Seek()` methods as these would // otherwise put a big burden on callers. Callers are expected to maintain // (returned) offset info if they require such granular state. class CordRepBtreeNavigator { … }; // Returns true if this instance is not empty. operator bool() inline CordRepBtree* CordRepBtreeNavigator::btree() const { … } inline CordRep* CordRepBtreeNavigator::Current() const { … } inline void CordRepBtreeNavigator::Reset() { … } inline CordRep* CordRepBtreeNavigator::InitFirst(CordRepBtree* tree) { … } inline CordRep* CordRepBtreeNavigator::InitLast(CordRepBtree* tree) { … } template <CordRepBtree::EdgeType edge_type> inline CordRep* CordRepBtreeNavigator::Init(CordRepBtree* tree) { … } inline CordRepBtreeNavigator::Position CordRepBtreeNavigator::Seek( size_t offset) { … } inline CordRepBtreeNavigator::Position CordRepBtreeNavigator::InitOffset( CordRepBtree* tree, size_t offset) { … } inline CordRep* CordRepBtreeNavigator::Next() { … } inline CordRep* CordRepBtreeNavigator::Previous() { … } inline CordRep* CordRepBtreeNavigator::NextUp() { … } inline CordRep* CordRepBtreeNavigator::PreviousUp() { … } } // namespace cord_internal ABSL_NAMESPACE_END } // namespace absl #endif // ABSL_STRINGS_INTERNAL_CORD_REP_BTREE_NAVIGATOR_H_