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