tvm
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 <dmlc/logging.h>
28 #include <tvm/runtime/logging.h>
29 #include <tvm/runtime/memory.h>
30 #include <tvm/runtime/object.h>
31 
32 #include <algorithm>
33 #include <initializer_list>
34 #include <utility>
35 
36 namespace tvm {
37 namespace runtime {
38 
40 struct ObjectHash {
46  size_t operator()(const ObjectRef& a) const;
47 };
48 
50 struct ObjectEqual {
57  bool operator()(const ObjectRef& a, const ObjectRef& b) const;
58 };
59 
99 template <typename ArrayType, typename ElemType>
101  public:
107  const ElemType& operator[](size_t idx) const {
108  size_t size = Self()->GetSize();
109  ICHECK_LT(idx, size) << "Index " << idx << " out of bounds " << size << "\n";
110  return *(reinterpret_cast<ElemType*>(AddressOf(idx)));
111  }
112 
118  ElemType& operator[](size_t idx) {
119  size_t size = Self()->GetSize();
120  ICHECK_LT(idx, size) << "Index " << idx << " out of bounds " << size << "\n";
121  return *(reinterpret_cast<ElemType*>(AddressOf(idx)));
122  }
123 
128  if (!(std::is_standard_layout<ElemType>::value && std::is_trivial<ElemType>::value)) {
129  size_t size = Self()->GetSize();
130  for (size_t i = 0; i < size; ++i) {
131  ElemType* fp = reinterpret_cast<ElemType*>(AddressOf(i));
132  fp->ElemType::~ElemType();
133  }
134  }
135  }
136 
137  protected:
148  template <typename... Args>
149  void EmplaceInit(size_t idx, Args&&... args) {
150  void* field_ptr = AddressOf(idx);
151  new (field_ptr) ElemType(std::forward<Args>(args)...);
152  }
153 
159  inline ArrayType* Self() const {
160  return static_cast<ArrayType*>(const_cast<InplaceArrayBase*>(this));
161  }
162 
169  void* AddressOf(size_t idx) const {
170  static_assert(
171  alignof(ArrayType) % alignof(ElemType) == 0 && sizeof(ArrayType) % alignof(ElemType) == 0,
172  "The size and alignment of ArrayType should respect "
173  "ElemType's alignment.");
174 
175  size_t kDataStart = sizeof(ArrayType);
176  ArrayType* self = Self();
177  char* data_start = reinterpret_cast<char*>(self) + kDataStart;
178  return data_start + idx * sizeof(ElemType);
179  }
180 };
181 
187 template <typename Converter, typename TIter>
188 class IterAdapter {
189  public:
190  using difference_type = typename std::iterator_traits<TIter>::difference_type;
191  using value_type = typename Converter::ResultType;
192  using pointer = typename Converter::ResultType*;
193  using reference = typename Converter::ResultType&;
194  using iterator_category = typename std::iterator_traits<TIter>::iterator_category;
195 
196  explicit IterAdapter(TIter iter) : iter_(iter) {}
198  ++iter_;
199  return *this;
200  }
202  --iter_;
203  return *this;
204  }
206  IterAdapter copy = *this;
207  ++iter_;
208  return copy;
209  }
211  IterAdapter copy = *this;
212  --iter_;
213  return copy;
214  }
215 
216  IterAdapter operator+(difference_type offset) const { return IterAdapter(iter_ + offset); }
217 
218  IterAdapter operator-(difference_type offset) const { return IterAdapter(iter_ - offset); }
219 
220  template <typename T = IterAdapter>
221  typename std::enable_if<std::is_same<iterator_category, std::random_access_iterator_tag>::value,
222  typename T::difference_type>::type inline
223  operator-(const IterAdapter& rhs) const {
224  return iter_ - rhs.iter_;
225  }
226 
227  bool operator==(IterAdapter other) const { return iter_ == other.iter_; }
228  bool operator!=(IterAdapter other) const { return !(*this == other); }
229  const value_type operator*() const { return Converter::convert(*iter_); }
230 
231  private:
232  TIter iter_;
233 };
234 
240 template <typename Converter, typename TIter>
242  public:
243  using difference_type = typename std::iterator_traits<TIter>::difference_type;
244  using value_type = typename Converter::ResultType;
245  using pointer = typename Converter::ResultType*;
246  using reference = typename Converter::ResultType&; // NOLINT(*)
247  using iterator_category = typename std::iterator_traits<TIter>::iterator_category;
248 
249  explicit ReverseIterAdapter(TIter iter) : iter_(iter) {}
251  --iter_;
252  return *this;
253  }
255  ++iter_;
256  return *this;
257  }
259  ReverseIterAdapter copy = *this;
260  --iter_;
261  return copy;
262  }
264  ReverseIterAdapter copy = *this;
265  ++iter_;
266  return copy;
267  }
269  return ReverseIterAdapter(iter_ - offset);
270  }
271 
272  template <typename T = ReverseIterAdapter>
273  typename std::enable_if<std::is_same<iterator_category, std::random_access_iterator_tag>::value,
274  typename T::difference_type>::type inline
275  operator-(const ReverseIterAdapter& rhs) const {
276  return rhs.iter_ - iter_;
277  }
278 
279  bool operator==(ReverseIterAdapter other) const { return iter_ == other.iter_; }
280  bool operator!=(ReverseIterAdapter other) const { return !(*this == other); }
281  const value_type operator*() const { return Converter::convert(*iter_); }
282 
283  private:
284  TIter iter_;
285 };
286 
287 } // namespace runtime
288 
289 // expose the functions to the root namespace.
290 using runtime::Downcast;
291 using runtime::IterAdapter;
293 using runtime::Object;
294 using runtime::ObjectEqual;
295 using runtime::ObjectHash;
296 using runtime::ObjectPtr;
297 using runtime::ObjectPtrEqual;
298 using runtime::ObjectPtrHash;
299 using runtime::ObjectRef;
300 } // namespace tvm
301 
302 #endif // TVM_RUNTIME_CONTAINER_BASE_H_
Base template for classes with array like memory layout.
Definition: base.h:100
void * AddressOf(size_t idx) const
Return the raw pointer to the element at idx.
Definition: base.h:169
const ElemType & operator[](size_t idx) const
Access element at index.
Definition: base.h:107
void EmplaceInit(size_t idx, Args &&... args)
Construct a value in place with the arguments.
Definition: base.h:149
ElemType & operator[](size_t idx)
Access element at index.
Definition: base.h:118
~InplaceArrayBase()
Destroy the Inplace Array Base object.
Definition: base.h:127
ArrayType * Self() const
Return the self object for the array.
Definition: base.h:159
iterator adapter that adapts TIter to return another type.
Definition: base.h:188
typename Converter::ResultType value_type
Definition: base.h:191
IterAdapter & operator++()
Definition: base.h:197
const value_type operator*() const
Definition: base.h:229
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:223
typename Converter::ResultType & reference
Definition: base.h:193
bool operator!=(IterAdapter other) const
Definition: base.h:228
IterAdapter operator++(int)
Definition: base.h:205
IterAdapter operator+(difference_type offset) const
Definition: base.h:216
typename std::iterator_traits< TIter >::difference_type difference_type
Definition: base.h:190
IterAdapter operator-(difference_type offset) const
Definition: base.h:218
IterAdapter(TIter iter)
Definition: base.h:196
bool operator==(IterAdapter other) const
Definition: base.h:227
IterAdapter & operator--()
Definition: base.h:201
typename std::iterator_traits< TIter >::iterator_category iterator_category
Definition: base.h:194
IterAdapter operator--(int)
Definition: base.h:210
typename Converter::ResultType * pointer
Definition: base.h:192
Base class of all object reference.
Definition: object.h:519
iterator adapter that adapts TIter to return another type.
Definition: base.h:241
const value_type operator*() const
Definition: base.h:281
typename Converter::ResultType & reference
Definition: base.h:246
bool operator!=(ReverseIterAdapter other) const
Definition: base.h:280
ReverseIterAdapter operator+(difference_type offset) const
Definition: base.h:268
ReverseIterAdapter & operator++()
Definition: base.h:250
ReverseIterAdapter operator--(int)
Definition: base.h:263
typename std::iterator_traits< TIter >::iterator_category iterator_category
Definition: base.h:247
ReverseIterAdapter(TIter iter)
Definition: base.h:249
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:275
ReverseIterAdapter operator++(int)
Definition: base.h:258
typename std::iterator_traits< TIter >::difference_type difference_type
Definition: base.h:243
typename Converter::ResultType value_type
Definition: base.h:244
typename Converter::ResultType * pointer
Definition: base.h:245
bool operator==(ReverseIterAdapter other) const
Definition: base.h:279
ReverseIterAdapter & operator--()
Definition: base.h:254
ObjectPtr< ArrayNode > make_object()
Definition: array.h:898
SubRef Downcast(BaseRef ref)
Downcast a base reference type to a more specific type.
Definition: object.h:932
runtime implementation for LibTorch/TorchScript.
Definition: analyzer.h:36
A managed object in the TVM runtime.
Runtime memory management.
String-aware ObjectRef hash functor.
Definition: base.h:50
bool operator()(const ObjectRef &a, const ObjectRef &b) const
Check if the two ObjectRef are equal.
Definition: string.h:517
String-aware ObjectRef equal functor.
Definition: base.h:40
size_t operator()(const ObjectRef &a) const
Calculate the hash code of an ObjectRef.
Definition: string.h:510