tvm
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
base.h
Go to the documentation of this file.
1 /*
2  * Licensed to the Apache Software Foundation (ASF) under one
3  * or more contributor license agreements. See the NOTICE file
4  * distributed with this work for additional information
5  * regarding copyright ownership. The ASF licenses this file
6  * to you under the Apache License, Version 2.0 (the
7  * "License"); you may not use this file except in compliance
8  * with the License. You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing,
13  * software distributed under the License is distributed on an
14  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15  * KIND, either express or implied. See the License for the
16  * specific language governing permissions and limitations
17  * under the License.
18  */
19 
24 #ifndef TVM_RUNTIME_CONTAINER_BASE_H_
25 #define TVM_RUNTIME_CONTAINER_BASE_H_
26 
27 #include <tvm/runtime/logging.h>
28 #include <tvm/runtime/memory.h>
29 #include <tvm/runtime/object.h>
30 
31 #include <algorithm>
32 #include <initializer_list>
33 #include <utility>
34 
35 namespace tvm {
36 namespace runtime {
37 
39 struct ObjectHash {
45  size_t operator()(const ObjectRef& a) const;
46 };
47 
49 struct ObjectEqual {
56  bool operator()(const ObjectRef& a, const ObjectRef& b) const;
57 };
58 
98 template <typename ArrayType, typename ElemType>
100  public:
106  const ElemType& operator[](size_t idx) const {
107  size_t size = Self()->GetSize();
108  ICHECK_LT(idx, size) << "Index " << idx << " out of bounds " << size << "\n";
109  return *(reinterpret_cast<ElemType*>(AddressOf(idx)));
110  }
111 
117  ElemType& operator[](size_t idx) {
118  size_t size = Self()->GetSize();
119  ICHECK_LT(idx, size) << "Index " << idx << " out of bounds " << size << "\n";
120  return *(reinterpret_cast<ElemType*>(AddressOf(idx)));
121  }
122 
127  if (!(std::is_standard_layout<ElemType>::value && std::is_trivial<ElemType>::value)) {
128  size_t size = Self()->GetSize();
129  for (size_t i = 0; i < size; ++i) {
130  ElemType* fp = reinterpret_cast<ElemType*>(AddressOf(i));
131  fp->ElemType::~ElemType();
132  }
133  }
134  }
135 
136  protected:
147  template <typename... Args>
148  void EmplaceInit(size_t idx, Args&&... args) {
149  void* field_ptr = AddressOf(idx);
150  new (field_ptr) ElemType(std::forward<Args>(args)...);
151  }
152 
158  inline ArrayType* Self() const {
159  return static_cast<ArrayType*>(const_cast<InplaceArrayBase*>(this));
160  }
161 
168  void* AddressOf(size_t idx) const {
169  static_assert(
170  alignof(ArrayType) % alignof(ElemType) == 0 && sizeof(ArrayType) % alignof(ElemType) == 0,
171  "The size and alignment of ArrayType should respect "
172  "ElemType's alignment.");
173 
174  size_t kDataStart = sizeof(ArrayType);
175  ArrayType* self = Self();
176  char* data_start = reinterpret_cast<char*>(self) + kDataStart;
177  return data_start + idx * sizeof(ElemType);
178  }
179 };
180 
186 template <typename Converter, typename TIter>
187 class IterAdapter {
188  public:
189  using difference_type = typename std::iterator_traits<TIter>::difference_type;
190  using value_type = typename Converter::ResultType;
191  using pointer = typename Converter::ResultType*;
192  using reference = typename Converter::ResultType&;
193  using iterator_category = typename std::iterator_traits<TIter>::iterator_category;
194 
195  explicit IterAdapter(TIter iter) : iter_(iter) {}
197  ++iter_;
198  return *this;
199  }
201  --iter_;
202  return *this;
203  }
205  IterAdapter copy = *this;
206  ++iter_;
207  return copy;
208  }
210  IterAdapter copy = *this;
211  --iter_;
212  return copy;
213  }
214 
215  IterAdapter operator+(difference_type offset) const { return IterAdapter(iter_ + offset); }
216 
217  IterAdapter operator-(difference_type offset) const { return IterAdapter(iter_ - offset); }
218 
219  template <typename T = IterAdapter>
220  typename std::enable_if<std::is_same<iterator_category, std::random_access_iterator_tag>::value,
221  typename T::difference_type>::type inline
222  operator-(const IterAdapter& rhs) const {
223  return iter_ - rhs.iter_;
224  }
225 
226  bool operator==(IterAdapter other) const { return iter_ == other.iter_; }
227  bool operator!=(IterAdapter other) const { return !(*this == other); }
228  const value_type operator*() const { return Converter::convert(*iter_); }
229 
230  private:
231  TIter iter_;
232 };
233 
239 template <typename Converter, typename TIter>
241  public:
242  using difference_type = typename std::iterator_traits<TIter>::difference_type;
243  using value_type = typename Converter::ResultType;
244  using pointer = typename Converter::ResultType*;
245  using reference = typename Converter::ResultType&; // NOLINT(*)
246  using iterator_category = typename std::iterator_traits<TIter>::iterator_category;
247 
248  explicit ReverseIterAdapter(TIter iter) : iter_(iter) {}
250  --iter_;
251  return *this;
252  }
254  ++iter_;
255  return *this;
256  }
258  ReverseIterAdapter copy = *this;
259  --iter_;
260  return copy;
261  }
263  ReverseIterAdapter copy = *this;
264  ++iter_;
265  return copy;
266  }
268  return ReverseIterAdapter(iter_ - offset);
269  }
270 
271  template <typename T = ReverseIterAdapter>
272  typename std::enable_if<std::is_same<iterator_category, std::random_access_iterator_tag>::value,
273  typename T::difference_type>::type inline
274  operator-(const ReverseIterAdapter& rhs) const {
275  return rhs.iter_ - iter_;
276  }
277 
278  bool operator==(ReverseIterAdapter other) const { return iter_ == other.iter_; }
279  bool operator!=(ReverseIterAdapter other) const { return !(*this == other); }
280  const value_type operator*() const { return Converter::convert(*iter_); }
281 
282  private:
283  TIter iter_;
284 };
285 
286 } // namespace runtime
287 
288 // expose the functions to the root namespace.
289 using runtime::Downcast;
290 using runtime::IterAdapter;
292 using runtime::Object;
293 using runtime::ObjectEqual;
294 using runtime::ObjectHash;
295 using runtime::ObjectPtr;
296 using runtime::ObjectPtrEqual;
297 using runtime::ObjectPtrHash;
298 using runtime::ObjectRef;
299 } // namespace tvm
300 
301 #endif // TVM_RUNTIME_CONTAINER_BASE_H_
Base template for classes with array like memory layout.
Definition: base.h:99
void * AddressOf(size_t idx) const
Return the raw pointer to the element at idx.
Definition: base.h:168
const ElemType & operator[](size_t idx) const
Access element at index.
Definition: base.h:106
void EmplaceInit(size_t idx, Args &&... args)
Construct a value in place with the arguments.
Definition: base.h:148
ElemType & operator[](size_t idx)
Access element at index.
Definition: base.h:117
~InplaceArrayBase()
Destroy the Inplace Array Base object.
Definition: base.h:126
ArrayType * Self() const
Return the self object for the array.
Definition: base.h:158
iterator adapter that adapts TIter to return another type.
Definition: base.h:187
typename Converter::ResultType value_type
Definition: base.h:190
IterAdapter & operator++()
Definition: base.h:196
const value_type operator*() const
Definition: base.h:228
std::enable_if< std::is_same< iterator_category, std::random_access_iterator_tag >::value, typename T::difference_type >::type operator-(const IterAdapter &rhs) const
Definition: base.h:222
typename Converter::ResultType & reference
Definition: base.h:192
bool operator!=(IterAdapter other) const
Definition: base.h:227
IterAdapter operator++(int)
Definition: base.h:204
IterAdapter operator+(difference_type offset) const
Definition: base.h:215
typename std::iterator_traits< TIter >::difference_type difference_type
Definition: base.h:189
IterAdapter operator-(difference_type offset) const
Definition: base.h:217
IterAdapter(TIter iter)
Definition: base.h:195
bool operator==(IterAdapter other) const
Definition: base.h:226
IterAdapter & operator--()
Definition: base.h:200
typename std::iterator_traits< TIter >::iterator_category iterator_category
Definition: base.h:193
IterAdapter operator--(int)
Definition: base.h:209
typename Converter::ResultType * pointer
Definition: base.h:191
Base class of all object reference.
Definition: object.h:520
iterator adapter that adapts TIter to return another type.
Definition: base.h:240
const value_type operator*() const
Definition: base.h:280
typename Converter::ResultType & reference
Definition: base.h:245
bool operator!=(ReverseIterAdapter other) const
Definition: base.h:279
ReverseIterAdapter operator+(difference_type offset) const
Definition: base.h:267
ReverseIterAdapter & operator++()
Definition: base.h:249
ReverseIterAdapter operator--(int)
Definition: base.h:262
typename std::iterator_traits< TIter >::iterator_category iterator_category
Definition: base.h:246
ReverseIterAdapter(TIter iter)
Definition: base.h:248
std::enable_if< std::is_same< iterator_category, std::random_access_iterator_tag >::value, typename T::difference_type >::type operator-(const ReverseIterAdapter &rhs) const
Definition: base.h:274
ReverseIterAdapter operator++(int)
Definition: base.h:257
typename std::iterator_traits< TIter >::difference_type difference_type
Definition: base.h:242
typename Converter::ResultType value_type
Definition: base.h:243
typename Converter::ResultType * pointer
Definition: base.h:244
bool operator==(ReverseIterAdapter other) const
Definition: base.h:278
ReverseIterAdapter & operator--()
Definition: base.h:253
Runtime memory management.
ObjectPtr< ArrayNode > make_object()
Definition: array.h:908
SubRef Downcast(BaseRef ref)
Downcast a base reference type to a more specific type.
Definition: object.h:937
Performance counters for profiling via the PAPI library.
Definition: analyzer.h:36
A managed object in the TVM runtime.
String-aware ObjectRef hash functor.
Definition: base.h:49
bool operator()(const ObjectRef &a, const ObjectRef &b) const
Check if the two ObjectRef are equal.
Definition: string.h:516
String-aware ObjectRef equal functor.
Definition: base.h:39
size_t operator()(const ObjectRef &a) const
Calculate the hash code of an ObjectRef.
Definition: string.h:509