blob: d0ebeffc227c59d4a91213d777fe7d5dd216d3e4 [file] [log] [blame]
James Feist6714a252018-09-10 15:26:18 -07001/*
2// Copyright (c) 2018 Intel Corporation
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8// http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15*/
16
17#pragma once
Josh Lehan129de0a2021-03-24 18:29:50 -070018#include <boost/type_index.hpp>
19
Unive Tienbd815c72025-05-28 09:28:54 +080020#include <concepts>
James Feist0ffe7142018-11-28 15:25:53 -080021#include <stdexcept>
James Feist6714a252018-09-10 15:26:18 -070022#include <string>
Unive Tienbd815c72025-05-28 09:28:54 +080023#include <vector>
James Feist6714a252018-09-10 15:26:18 -070024
Josh Lehan129de0a2021-03-24 18:29:50 -070025namespace details
James Feist6714a252018-09-10 15:26:18 -070026{
James Feist0ffe7142018-11-28 15:25:53 -080027
Josh Lehan129de0a2021-03-24 18:29:50 -070028template <typename U>
29struct VariantToNumericVisitor
30{
James Feistd8705872019-02-08 13:26:09 -080031 template <typename T>
Josh Lehan129de0a2021-03-24 18:29:50 -070032 U operator()(const T& t) const
James Feist6714a252018-09-10 15:26:18 -070033 {
James Feist0ffe7142018-11-28 15:25:53 -080034 if constexpr (std::is_arithmetic_v<T>)
35 {
Josh Lehan129de0a2021-03-24 18:29:50 -070036 return static_cast<U>(t);
James Feist0ffe7142018-11-28 15:25:53 -080037 }
Josh Lehan129de0a2021-03-24 18:29:50 -070038 throw std::invalid_argument(
39 "Cannot translate type " +
40 boost::typeindex::type_id<T>().pretty_name() + " to " +
41 boost::typeindex::type_id<U>().pretty_name());
James Feist6714a252018-09-10 15:26:18 -070042 }
43};
James Feist6714a252018-09-10 15:26:18 -070044
Josh Lehan129de0a2021-03-24 18:29:50 -070045} // namespace details
James Feist6714a252018-09-10 15:26:18 -070046
Josh Lehan129de0a2021-03-24 18:29:50 -070047using VariantToFloatVisitor = details::VariantToNumericVisitor<float>;
48using VariantToIntVisitor = details::VariantToNumericVisitor<int>;
49using VariantToUnsignedIntVisitor =
50 details::VariantToNumericVisitor<unsigned int>;
51using VariantToDoubleVisitor = details::VariantToNumericVisitor<double>;
James Feist6714a252018-09-10 15:26:18 -070052
James Feist0ffe7142018-11-28 15:25:53 -080053struct VariantToStringVisitor
James Feist6714a252018-09-10 15:26:18 -070054{
James Feistd8705872019-02-08 13:26:09 -080055 template <typename T>
56 std::string operator()(const T& t) const
James Feist6714a252018-09-10 15:26:18 -070057 {
James Feist0ffe7142018-11-28 15:25:53 -080058 if constexpr (std::is_same_v<T, std::string>)
59 {
60 return t;
61 }
62 else if constexpr (std::is_arithmetic_v<T>)
63 {
64 return std::to_string(t);
65 }
Josh Lehan129de0a2021-03-24 18:29:50 -070066 throw std::invalid_argument(
67 "Cannot translate type " +
68 boost::typeindex::type_id<T>().pretty_name() + " to string");
James Feist0ffe7142018-11-28 15:25:53 -080069 }
70};
Unive Tienbd815c72025-05-28 09:28:54 +080071
72template <std::integral V, std::integral U>
73struct VariantToNumArrayVisitor
74{
75 template <typename T>
76 std::vector<V> operator()(const T& t) const
77 {
78 if constexpr (std::is_same_v<T, std::vector<U>>)
79 {
80 std::vector<V> output;
81 output.reserve(t.size());
82
83 for (const auto& value : t)
84 {
85 output.push_back(static_cast<V>(value));
86 }
87
88 return output;
89 }
90 throw std::invalid_argument(
91 "Cannot handle type " +
92 boost::typeindex::type_id<T>().pretty_name() + " to vector<U>");
93 }
94};