1#ifndef FREE_TENSOR_CONTAINER_UTILS_H
2#define FREE_TENSOR_CONTAINER_UTILS_H
11#include <unordered_map>
12#include <unordered_set>
15#include <range/v3/range.hpp>
16#include <range/v3/view.hpp>
20namespace views = ranges::views;
22template <
class T,
class V1,
class V2,
class Hash,
class KeyEqual>
23std::unordered_map<T, std::pair<V1, V2>, Hash, KeyEqual>
25 const std::unordered_map<T, V2, Hash, KeyEqual> &
rhs) {
26 std::unordered_map<T, std::pair<V1, V2>, Hash, KeyEqual> ret;
27 ret.reserve(std::min(
lhs.size(),
rhs.size()));
28 for (
auto &&[key, v1] :
lhs) {
30 ret.emplace(key, std::make_pair(v1,
rhs.at(key)));
36template <
class T,
class Hash,
class KeyEqual>
37std::unordered_set<T, Hash, KeyEqual>
39 const std::unordered_set<T, Hash, KeyEqual> &
rhs) {
40 std::unordered_set<T, Hash, KeyEqual> ret;
41 ret.reserve(std::min(
lhs.size(),
rhs.size()));
42 for (
auto &&key :
lhs) {
50template <
class T,
class Hash,
class KeyEqual>
52 const std::unordered_set<T, Hash, KeyEqual> &
rhs) {
53 for (
auto &&item :
lhs) {
54 if (
rhs.count(item)) {
64 ret.reserve(std::min(
lhs.size(),
rhs.size()));
65 for (
auto &&item :
lhs) {
66 if (std::find(
rhs.begin(),
rhs.end(), item) !=
rhs.end()) {
67 ret.emplace_back(item);
73template <
class T,
class Hash,
class KeyEqual>
75 const std::unordered_set<T, Hash, KeyEqual> &
rhs) {
76 for (
auto &&item :
lhs) {
77 if (!
rhs.count(item)) {
85std::vector<T>
uni(
const std::vector<T> &
lhs,
const std::vector<T> &
rhs) {
87 ret.reserve(std::max(
lhs.size(),
rhs.size()));
88 ret.insert(ret.end(),
lhs.begin(),
lhs.end());
89 for (
auto &&item :
rhs) {
90 if (std::find(
lhs.begin(),
lhs.end(), item) ==
lhs.end()) {
91 ret.emplace_back(item);
96template <
class T,
class Hash,
class KeyEqual>
97std::unordered_set<T, Hash, KeyEqual>
98uni(
const std::unordered_set<T, Hash, KeyEqual> &
lhs,
99 const std::unordered_set<T, Hash, KeyEqual> &
rhs) {
100 if (
lhs.size() <
rhs.size()) {
104 for (
auto &&item :
rhs) {
110template <
class T,
class Hash,
class KeyEqual>
111std::unordered_set<T, Hash, KeyEqual>
112diff(
const std::unordered_set<T, Hash, KeyEqual> &
lhs,
113 const std::unordered_set<T, Hash, KeyEqual> &
rhs) {
115 for (
auto &&item :
rhs) {
122std::vector<T>
cat(
const std::vector<T> &
lhs,
const std::vector<T> &
rhs) {
124 ret.reserve(
lhs.size() +
rhs.size());
125 ret.insert(ret.end(),
lhs.begin(),
lhs.end());
126 ret.insert(ret.end(),
rhs.begin(),
rhs.end());
130template <
class T,
class U>
131std::vector<T>
filter(
const std::vector<T> &vec,
const U &callback) {
133 ret.reserve(vec.size());
134 for (
auto item : vec) {
135 if (callback(item)) {
136 ret.emplace_back(item);
142inline std::string
tolower(
const std::string &s) {
144 ret.reserve(s.length());
146 ret.push_back(std::tolower(c));
154std::string
slice(
const std::string &s,
int begin,
int end);
155inline std::string
slice(
const std::string &s,
int begin) {
156 return slice(s, begin, s.length());
164requires std::ranges::range<T> && (!std::convertible_to<T, std::string>)
165std::ostream &
operator<<(std::ostream &os,
const T &r) {
166 for (
auto &&[i, item] : views::enumerate(r)) {
167 os << (i > 0 ?
", " :
"") << item;
176template <
typename... Ts>
177std::ostream &
operator<<(std::ostream &os, std::tuple<Ts...>
const &tuple) {
179 [&os](Ts
const &...t) -> std::ostream & {
181 return ((os << (i++ > 0 ?
", " :
"") << t), ...);
193template <std::ranges::range Container>
194std::string
join(Container &&c,
const std::string &splitter) {
195 std::ostringstream oss;
197 for (
const auto &s : c) {
206inline auto join(
const std::string &splitter) {
return _Join{splitter}; }
208template <std::ranges::range Container>
210 return join(std::forward<Container>(c), joiner.
splitter);
Definition: allocator.h:9
auto && lhs
Definition: const_fold.cc:70
std::unordered_set< T, Hash, KeyEqual > diff(const std::unordered_set< T, Hash, KeyEqual > &lhs, const std::unordered_set< T, Hash, KeyEqual > &rhs)
Definition: container_utils.h:112
std::string tolower(const std::string &s)
Definition: container_utils.h:142
std::string slice(const std::string &s, int begin, int end)
Definition: container_utils.cc:6
bool isSubSetOf(const std::unordered_set< T, Hash, KeyEqual > &lhs, const std::unordered_set< T, Hash, KeyEqual > &rhs)
Definition: container_utils.h:74
std::vector< T > filter(const std::vector< T > &vec, const U &callback)
Definition: container_utils.h:131
std::vector< T > uni(const std::vector< T > &lhs, const std::vector< T > &rhs)
Definition: container_utils.h:85
std::string join(Container &&c, const std::string &splitter)
Definition: container_utils.h:194
bool hasIntersect(const std::unordered_set< T, Hash, KeyEqual > &lhs, const std::unordered_set< T, Hash, KeyEqual > &rhs)
Definition: container_utils.h:51
auto auto && rhs
Definition: const_fold.cc:70
std::vector< T > cat(const std::vector< T > &lhs, const std::vector< T > &rhs)
Definition: container_utils.h:122
std::ostream & operator<<(std::ostream &os, const Dependence &dep)
Definition: deps.cc:1404
std::unordered_map< T, std::pair< V1, V2 >, Hash, KeyEqual > intersect(const std::unordered_map< T, V1, Hash, KeyEqual > &lhs, const std::unordered_map< T, V2, Hash, KeyEqual > &rhs)
Definition: container_utils.h:24
auto operator|(Container &&c, const _Join &joiner)
Definition: container_utils.h:209
Definition: container_utils.h:189
const std::string & splitter
Definition: container_utils.h:190