blob: 52477ea4dbdec6247a740e89e993eea9674c664a [file]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#include <tvm/ffi/extra/stl.h>
#include <tvm/ffi/function.h>
#include <array>
#include <functional>
#include <map>
#include <numeric>
#include <optional>
#include <tuple>
#include <unordered_map>
#include <variant>
#include <vector>
namespace {
auto test_tuple(std::tuple<int, float> arg) -> std::tuple<float, int> {
return std::make_tuple(std::get<1>(arg), std::get<0>(arg));
}
auto test_vector(std::optional<std::vector<std::array<int, 2>>> arg)
-> std::optional<std::vector<int>> {
if (arg) {
auto result = std::vector<int>{};
result.reserve(arg->size());
for (const auto& row : *arg) {
result.push_back(std::accumulate(row.begin(), row.end(), 0));
}
return result;
} else {
return std::nullopt;
}
}
auto test_variant(std::variant<int, float, std::vector<std::variant<int, float>>> arg)
-> std::variant<std::string, std::vector<std::string>> {
if (std::holds_alternative<int>(arg)) {
return "int";
} else if (std::holds_alternative<float>(arg)) {
return "float";
} else {
auto result = std::vector<std::string>{};
for (const auto& item : std::get<std::vector<std::variant<int, float>>>(arg)) {
if (std::holds_alternative<int>(item)) {
result.emplace_back("int");
} else {
result.emplace_back("float");
}
}
return result;
}
}
auto test_map(const std::map<std::string, int>& map) -> std::map<int, std::string> {
auto result = std::map<int, std::string>{};
for (const auto& [key, value] : map) {
result[value] = key;
}
return result;
}
auto test_map_2(const std::unordered_map<std::string, int>& map)
-> std::unordered_map<int, std::string> {
auto result = std::unordered_map<int, std::string>{};
for (const auto& [key, value] : map) {
result[value] = key;
}
return result;
}
auto test_function(std::function<int(void)> f) -> std::function<int(void)> {
return [fn = std::move(f)] { return fn() + 1; };
}
TVM_FFI_DLL_EXPORT_TYPED_FUNC(test_tuple, test_tuple)
TVM_FFI_DLL_EXPORT_TYPED_FUNC(test_vector, test_vector)
TVM_FFI_DLL_EXPORT_TYPED_FUNC(test_variant, test_variant)
TVM_FFI_DLL_EXPORT_TYPED_FUNC(test_map, test_map)
TVM_FFI_DLL_EXPORT_TYPED_FUNC(test_map_2, test_map_2)
TVM_FFI_DLL_EXPORT_TYPED_FUNC(test_function, test_function)
} // namespace