5cbd3f29e3
Fuzz / Run fuzz harnesses (${{ github.event_name == 'schedule' && 'nightly' || 'smoke' }}) (push) Has been cancelled
Create Releases / call-mac (push) Has been cancelled
Create Releases / call-linux (push) Has been cancelled
Create Releases / call-sdist (push) Has been cancelled
Create Releases / call-win (push) Has been cancelled
Create Releases / call-pyodide (push) Has been cancelled
Windows_No_Exception_CI / build (x64, 3.10) (push) Has been cancelled
Check URLs / build (push) Has been cancelled
Create Releases / Attest CI build artifacts (push) Has been cancelled
Create Releases / Check for Publish release build to pypi (push) Has been cancelled
Create Releases / Check for Publish preview build to test.pypi-weekly (push) Has been cancelled
Create Releases / Publish preview build to test.pypi-weekly (push) Has been cancelled
Create Releases / Check for Publish release build to test.pypi (rc-candidates) (push) Has been cancelled
Create Releases / Publish release build to test.pypi (push) Has been cancelled
Create Releases / Check for Publish preview build to pypi-weekly (push) Has been cancelled
Create Releases / Publish preview build to pypi-weekly (push) Has been cancelled
Create Releases / Publish release build to pypi (push) Has been cancelled
Create Releases / test source distribution (push) Has been cancelled
clang-tidy / clang-tidy (push) Has been cancelled
Lint / Validate SBOM (push) Has been cancelled
Lint / Enforce style (push) Has been cancelled
CI / Test windows-2022, 3.14, External, debug=0, unity_build=0, onnx_ml=1, autogen=0 (push) Has been cancelled
CI / Test windows-latest, 3.10, Internal, debug=0, unity_build=0, onnx_ml=1, autogen=0 (push) Has been cancelled
CI / Test windows-latest, 3.14, Internal, debug=0, unity_build=0, onnx_ml=1, autogen=0 (push) Has been cancelled
CI / Test windows-latest, 3.14t, Internal, debug=0, unity_build=0, onnx_ml=1, autogen=0 (push) Has been cancelled
CI / Test ubuntu-24.04, 3.14, Internal, debug=1, unity_build=0, onnx_ml=1, autogen=0 (push) Has been cancelled
CI / Test ubuntu-24.04, 3.14, External, debug=0, unity_build=1, onnx_ml=1, autogen=1 (push) Has been cancelled
CI / Test ubuntu-24.04, 3.14, External, debug=0, unity_build=0, onnx_ml=0, autogen=0 (push) Has been cancelled
CI / Test macos-latest, 3.10, Internal, debug=0, unity_build=0, onnx_ml=1, autogen=0 (push) Has been cancelled
CI / Test macos-latest, 3.14, Internal, debug=0, unity_build=0, onnx_ml=1, autogen=0 (push) Has been cancelled
CI / Test macos-latest, 3.14t, Internal, debug=0, unity_build=0, onnx_ml=1, autogen=0 (push) Has been cancelled
CI / Test ubuntu-24.04, 3.14, External, debug=0, unity_build=0, onnx_ml=1, autogen=0 (push) Has been cancelled
CI / Test ubuntu-24.04, 3.10, Internal, debug=0, unity_build=0, onnx_ml=1, autogen=0 (push) Has been cancelled
CI / Test ubuntu-24.04, 3.14, Internal, debug=0, unity_build=0, onnx_ml=1, autogen=0 (push) Has been cancelled
CI / Test ubuntu-24.04, 3.14t, Internal, debug=0, unity_build=0, onnx_ml=1, autogen=0 (push) Has been cancelled
Pixi CI / Install and lint (ubuntu-24.04-arm) (push) Has been cancelled
Pixi CI / Install and lint (windows-2022) (push) Has been cancelled
Pixi CI / Xcode generator build (push) Has been cancelled
Pixi CI / Install and test (macos-latest, default) (push) Has been cancelled
Pixi CI / Install and test (ubuntu-24.04-arm, default) (push) Has been cancelled
Pixi CI / Install and test (ubuntu-latest, default) (push) Has been cancelled
Pixi CI / Install and test (windows-2022, default) (push) Has been cancelled
Pixi CI / Install and test (macos-latest, oldies) (push) Has been cancelled
Pixi CI / Install and test (ubuntu-24.04-arm, oldies) (push) Has been cancelled
Pixi CI / Install and test (ubuntu-latest, oldies) (push) Has been cancelled
Pixi CI / Install and test (windows-2022, oldies) (push) Has been cancelled
CodeQL / Analyze (actions) (push) Has been cancelled
CodeQL / Analyze (cpp) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Copilot Setup Steps / copilot-setup-steps (push) Has been cancelled
Generate and publish ONNX docs / build (push) Has been cancelled
Generate and publish ONNX docs / deploy (push) Has been cancelled
Scorecard supply-chain security / Scorecard analysis (push) Has been cancelled
166 lines
5.3 KiB
C++
166 lines
5.3 KiB
C++
// Copyright (c) ONNX Project Contributors
|
|
//
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
#ifndef ONNX_COMMON_GRAPH_NODE_LIST_H_
|
|
#define ONNX_COMMON_GRAPH_NODE_LIST_H_
|
|
|
|
// ATTENTION: The code in this file is highly EXPERIMENTAL.
|
|
// Adventurous users should note that the APIs will probably change.
|
|
|
|
#include <cstdint>
|
|
#include <iterator>
|
|
|
|
#include "onnx/common/assertions.h"
|
|
|
|
namespace ONNX_NAMESPACE {
|
|
|
|
// Intrusive doubly linked lists with sane reverse iterators.
|
|
// The header file is named graph_node_list.h because it is ONLY
|
|
// used for Graph's Node lists, and if you want to use it for other
|
|
// things, you will have to do some refactoring.
|
|
//
|
|
// At the moment, the templated type T must support a few operations:
|
|
//
|
|
// - It must have a field: T* next_in_graph[2] = { nullptr, nullptr };
|
|
// which are used for the intrusive linked list pointers.
|
|
//
|
|
// - It must have a method 'destroy()', which removes T from the
|
|
// list and frees a T.
|
|
//
|
|
// In practice, we are only using it with Node and const Node. 'destroy()'
|
|
// needs to be renegotiated if you want to use this somewhere else.
|
|
//
|
|
// Besides the benefits of being intrusive, unlike std::list, these lists handle
|
|
// forward and backward iteration uniformly because we require a
|
|
// "before-first-element" sentinel. This means that reverse iterators
|
|
// physically point to the element they logically point to, rather than
|
|
// the off-by-one behavior for all standard library reverse iterators.
|
|
|
|
static constexpr size_t kNextDirection = 0;
|
|
static constexpr size_t kPrevDirection = 1;
|
|
|
|
template <typename T>
|
|
struct generic_graph_node_list;
|
|
|
|
template <typename T>
|
|
struct generic_graph_node_list_iterator;
|
|
|
|
struct Node;
|
|
using graph_node_list = generic_graph_node_list<Node>;
|
|
using const_graph_node_list = generic_graph_node_list<const Node>;
|
|
using graph_node_list_iterator = generic_graph_node_list_iterator<Node>;
|
|
using const_graph_node_list_iterator = generic_graph_node_list_iterator<const Node>;
|
|
|
|
template <typename T>
|
|
struct generic_graph_node_list_iterator final {
|
|
using iterator_category = std::bidirectional_iterator_tag;
|
|
using value_type = T*;
|
|
using difference_type = int64_t;
|
|
using pointer = T**;
|
|
using reference = T*&;
|
|
generic_graph_node_list_iterator() : cur(nullptr), d(kNextDirection) {}
|
|
generic_graph_node_list_iterator(T* cur, size_t d) : cur(cur), d(d) {}
|
|
T* operator*() const {
|
|
return cur;
|
|
}
|
|
T* operator->() const {
|
|
return cur;
|
|
}
|
|
generic_graph_node_list_iterator& operator++() {
|
|
ONNX_ASSERT(cur)
|
|
cur = cur->next_in_graph[d];
|
|
return *this;
|
|
}
|
|
generic_graph_node_list_iterator operator++(int) {
|
|
generic_graph_node_list_iterator old = *this;
|
|
++(*this);
|
|
return old;
|
|
}
|
|
generic_graph_node_list_iterator& operator--() {
|
|
ONNX_ASSERT(cur)
|
|
cur = cur->next_in_graph[reverseDir()];
|
|
return *this;
|
|
}
|
|
generic_graph_node_list_iterator operator--(int) {
|
|
generic_graph_node_list_iterator old = *this;
|
|
--(*this);
|
|
return old;
|
|
}
|
|
|
|
// erase cur without invalidating this iterator
|
|
// named differently from destroy so that ->/. bugs do not
|
|
// silently cause the wrong one to be called.
|
|
// iterator will point to the previous entry after call
|
|
void destroyCurrent() {
|
|
T* n = cur;
|
|
cur = cur->next_in_graph[reverseDir()];
|
|
n->destroy();
|
|
}
|
|
generic_graph_node_list_iterator reverse() {
|
|
return generic_graph_node_list_iterator(cur, reverseDir());
|
|
}
|
|
|
|
private:
|
|
size_t reverseDir() {
|
|
return d == kNextDirection ? kPrevDirection : kNextDirection;
|
|
}
|
|
T* cur;
|
|
size_t d; // direction 0 is forward 1 is reverse, see next_in_graph
|
|
};
|
|
|
|
template <typename T>
|
|
struct generic_graph_node_list final {
|
|
using iterator = generic_graph_node_list_iterator<T>;
|
|
using const_iterator = generic_graph_node_list_iterator<const T>;
|
|
generic_graph_node_list_iterator<T> begin() {
|
|
return generic_graph_node_list_iterator<T>(head->next_in_graph[d], d);
|
|
}
|
|
generic_graph_node_list_iterator<const T> begin() const {
|
|
return generic_graph_node_list_iterator<const T>(head->next_in_graph[d], d);
|
|
}
|
|
generic_graph_node_list_iterator<T> end() {
|
|
return generic_graph_node_list_iterator<T>(head, d);
|
|
}
|
|
generic_graph_node_list_iterator<const T> end() const {
|
|
return generic_graph_node_list_iterator<const T>(head, d);
|
|
}
|
|
generic_graph_node_list_iterator<T> rbegin() {
|
|
return reverse().begin();
|
|
}
|
|
generic_graph_node_list_iterator<const T> rbegin() const {
|
|
return reverse().begin();
|
|
}
|
|
generic_graph_node_list_iterator<T> rend() {
|
|
return reverse().end();
|
|
}
|
|
generic_graph_node_list_iterator<const T> rend() const {
|
|
return reverse().end();
|
|
}
|
|
generic_graph_node_list reverse() {
|
|
return generic_graph_node_list(head, d == kNextDirection ? kPrevDirection : kNextDirection);
|
|
}
|
|
generic_graph_node_list reverse() const {
|
|
return generic_graph_node_list(head, d == kNextDirection ? kPrevDirection : kNextDirection);
|
|
}
|
|
generic_graph_node_list(T* head, size_t d) : head(head), d(d) {}
|
|
|
|
private:
|
|
T* head;
|
|
size_t d;
|
|
};
|
|
|
|
template <typename T>
|
|
static inline bool operator==(generic_graph_node_list_iterator<T> a, generic_graph_node_list_iterator<T> b) {
|
|
return *a == *b;
|
|
}
|
|
|
|
template <typename T>
|
|
static inline bool operator!=(generic_graph_node_list_iterator<T> a, generic_graph_node_list_iterator<T> b) {
|
|
return *a != *b;
|
|
}
|
|
|
|
} // namespace ONNX_NAMESPACE
|
|
|
|
#endif // ONNX_COMMON_GRAPH_NODE_LIST_H_
|