1c8b59c046895fa5b6d79f73e0b5817330fcfbfc1A. Unique TensorFlower/* Copyright 2015 The TensorFlow Authors. All Rights Reserved. 29c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath Kudlur 39c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath KudlurLicensed under the Apache License, Version 2.0 (the "License"); 49c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath Kudluryou may not use this file except in compliance with the License. 59c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath KudlurYou may obtain a copy of the License at 69c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath Kudlur 79c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath Kudlur http://www.apache.org/licenses/LICENSE-2.0 89c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath Kudlur 99c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath KudlurUnless required by applicable law or agreed to in writing, software 109c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath Kudlurdistributed under the License is distributed on an "AS IS" BASIS, 119c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath KudlurWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 129c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath KudlurSee the License for the specific language governing permissions and 139c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath Kudlurlimitations under the License. 149c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath Kudlur==============================================================================*/ 159c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath Kudlur 16f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur#ifndef TENSORFLOW_GRAPH_EDGESET_H_ 17f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur#define TENSORFLOW_GRAPH_EDGESET_H_ 18f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 19f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur#include <stddef.h> 20f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur#include <set> 21252bb90ca2dd412ca2fd2908faf1a25d6ef618cfJosh Levenberg#include "tensorflow/core/platform/macros.h" 22c10f439740396006e45059435e552e4d4ad2c1adJosh Levenberg#include "tensorflow/core/platform/types.h" 23f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 24f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur#include "tensorflow/core/platform/logging.h" 25f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurnamespace tensorflow { 26f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 27f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurclass Edge; 28f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 29f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur// An unordered set of edges. Uses very little memory for small sets. 30f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur// Unlike std::set, EdgeSet does NOT allow mutations during iteration. 31f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurclass EdgeSet { 32f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur public: 33f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur EdgeSet(); 34f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ~EdgeSet(); 35f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 36f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur typedef const Edge* key_type; 37f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur typedef const Edge* value_type; 38f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur typedef size_t size_type; 39f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur typedef ptrdiff_t difference_type; 40f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 41f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur class const_iterator; 42f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur typedef const_iterator iterator; 43f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 44f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur bool empty() const; 45f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur size_type size() const; 46f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur void clear(); 47f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur std::pair<iterator, bool> insert(value_type value); 48f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur size_type erase(key_type key); 49f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 50f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // Caller is not allowed to mutate the EdgeSet while iterating. 51f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur const_iterator begin() const; 52f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur const_iterator end() const; 53f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 54f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur private: 55f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // Up to kInline elements are stored directly in ptrs_ (nullptr means none). 56f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // If ptrs_[0] == this then ptrs_[1] points to a set<const Edge*>. 575c9ecbc32e17821506ee222fa2d4ce9c733a1248A. Unique TensorFlower static const int kInline = 4; // Must be >= 2. 58f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur const void* ptrs_[kInline]; 59f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 60f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur std::set<const Edge*>* get_set() const { 61f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur if (ptrs_[0] == this) { 62f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur return static_cast<std::set<const Edge*>*>(const_cast<void*>(ptrs_[1])); 63f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } else { 64f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur return nullptr; 65f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 66f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 67f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 68f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur// To detect mutations while iterating. 69f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur#ifdef NDEBUG 70f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur void RegisterMutation() {} 71f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur#else 72f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur uint32 mutations_ = 0; 73f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur void RegisterMutation() { mutations_++; } 74f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur#endif 75f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 76f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur TF_DISALLOW_COPY_AND_ASSIGN(EdgeSet); 77f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}; 78f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 79f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurclass EdgeSet::const_iterator { 80f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur public: 81f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur typedef typename EdgeSet::value_type value_type; 82f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur typedef const typename EdgeSet::value_type& reference; 83f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur typedef const typename EdgeSet::value_type* pointer; 84f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur typedef typename EdgeSet::difference_type difference_type; 85f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur typedef std::forward_iterator_tag iterator_category; 86f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 87f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur const_iterator() {} 88f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 89f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur const_iterator& operator++(); 90f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur const_iterator operator++(int /*unused*/); 91f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur const value_type* operator->() const; 92f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur value_type operator*() const; 93f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur bool operator==(const const_iterator& other) const; 94f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur bool operator!=(const const_iterator& other) const { 95f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur return !(*this == other); 96f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 97f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 98f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur private: 99f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur friend class EdgeSet; 100f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 101f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur void const* const* array_iter_ = nullptr; 102f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur typename std::set<const Edge*>::const_iterator tree_iter_; 103f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 104f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur#ifdef NDEBUG 105f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur inline void Init(const EdgeSet* e) {} 106f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur inline void CheckNoMutations() const {} 107f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur#else 108f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur inline void Init(const EdgeSet* e) { 109f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur owner_ = e; 110f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur init_mutations_ = e->mutations_; 111f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 112f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur inline void CheckNoMutations() const { 113f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur CHECK_EQ(init_mutations_, owner_->mutations_); 114f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 115f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur const EdgeSet* owner_ = nullptr; 116f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur uint32 init_mutations_ = 0; 117f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur#endif 118f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}; 119f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 120f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurinline EdgeSet::EdgeSet() { 121f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur for (int i = 0; i < kInline; i++) { 122f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ptrs_[i] = nullptr; 123f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 124f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 125f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 126f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurinline EdgeSet::~EdgeSet() { delete get_set(); } 127f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 128f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurinline bool EdgeSet::empty() const { return size() == 0; } 129f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 130f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurinline EdgeSet::size_type EdgeSet::size() const { 131f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur auto s = get_set(); 132f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur if (s) { 133f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur return s->size(); 134f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } else { 135f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur size_t result = 0; 136f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur for (int i = 0; i < kInline; i++) { 137f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur if (ptrs_[i]) result++; 138f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 139f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur return result; 140f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 141f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 142f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 143f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurinline void EdgeSet::clear() { 144f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur RegisterMutation(); 145f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur delete get_set(); 146f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur for (int i = 0; i < kInline; i++) { 147f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ptrs_[i] = nullptr; 148f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 149f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 150f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 151f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurinline EdgeSet::const_iterator EdgeSet::begin() const { 152f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur const_iterator ci; 153f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ci.Init(this); 154f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur auto s = get_set(); 155f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur if (s) { 156f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ci.tree_iter_ = s->begin(); 157f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } else { 158f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ci.array_iter_ = &ptrs_[0]; 159f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 160f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur return ci; 161f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 162f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 163f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurinline EdgeSet::const_iterator EdgeSet::end() const { 164f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur const_iterator ci; 165f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ci.Init(this); 166f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur auto s = get_set(); 167f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur if (s) { 168f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ci.tree_iter_ = s->end(); 169f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } else { 170f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ci.array_iter_ = &ptrs_[size()]; 171f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 172f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur return ci; 173f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 174f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 175f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurinline EdgeSet::const_iterator& EdgeSet::const_iterator::operator++() { 176f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur CheckNoMutations(); 177f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur if (array_iter_ != nullptr) { 178f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ++array_iter_; 179f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } else { 180f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur ++tree_iter_; 181f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 182f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur return *this; 183f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 184f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 185f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurinline EdgeSet::const_iterator EdgeSet::const_iterator::operator++( 186f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur int /*unused*/) { 187f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur CheckNoMutations(); 188f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur const_iterator tmp = *this; 189f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur operator++(); 190f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur return tmp; 191f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 192f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 193f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur// gcc's set and multiset always use const_iterator since it will otherwise 194f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur// allow modification of keys. 195f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurinline const EdgeSet::const_iterator::value_type* EdgeSet::const_iterator:: 196f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudluroperator->() const { 197f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur CheckNoMutations(); 198f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur if (array_iter_ != nullptr) { 199f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur return reinterpret_cast<const value_type*>(array_iter_); 200f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } else { 201f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur return tree_iter_.operator->(); 202f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 203f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 204f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 205f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur// gcc's set and multiset always use const_iterator since it will otherwise 206f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur// allow modification of keys. 207f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurinline EdgeSet::const_iterator::value_type EdgeSet::const_iterator::operator*() 208f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur const { 209f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur CheckNoMutations(); 210f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur if (array_iter_ != nullptr) { 211f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur return static_cast<value_type>(*array_iter_); 212f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } else { 213f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur return *tree_iter_; 214f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 215f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 216f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 217f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurinline bool EdgeSet::const_iterator::operator==( 218f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur const const_iterator& other) const { 219f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur DCHECK((array_iter_ == nullptr) == (other.array_iter_ == nullptr)) 220f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur << "Iterators being compared must be from same set that has not " 221f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur << "been modified since the iterator was constructed"; 222f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur CheckNoMutations(); 223f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur if (array_iter_ != nullptr) { 224f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur return array_iter_ == other.array_iter_; 225f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } else { 226f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur return other.array_iter_ == nullptr && tree_iter_ == other.tree_iter_; 227f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 228f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 229f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 230f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} // namespace tensorflow 231f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 232f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur#endif // TENSORFLOW_GRAPH_EDGESET_H_ 233