76 if (std::holds_alternative<std::string>(value)) {
79 else if (std::holds_alternative<bool>(value)) [[likely]] {
80 return number(std::get<bool>(value) ? 1 : 0);
82 else if (std::holds_alternative<int>(value)) {
83 return number(std::get<int>(value) ? 1 : 0);
85 else if (std::holds_alternative<double>(value)) {
86 return number(std::get<double>(value) ? 1 : 0);
89 throw std::logic_error(
"to_number: value holds no alternative" );
92 if (std::holds_alternative<std::string>(value)) {
95 else if (std::holds_alternative<bool>(value)) {
96 return number(std::get<bool>(value) ? 1 : 0);
98 else if (std::holds_alternative<int>(value)) [[likely]] {
99 return number(std::get<int>(value));
101 else if (std::holds_alternative<double>(value)) {
102 return number((
int)std::get<double>(value));
105 throw std::logic_error(
"to_number: value holds no alternative" );
108 if (std::holds_alternative<std::string>(value)) {
111 else if (std::holds_alternative<bool>(value)) {
112 return number(std::get<bool>(value) ? 1 : 0);
114 else if (std::holds_alternative<int>(value)) {
115 return number(std::get<int>(value));
117 else if (std::holds_alternative<double>(value)) [[likely]] {
118 return number(std::get<double>(value));
121 throw std::logic_error(
"to_number: value holds no alternative" );
124 if (std::holds_alternative<std::string>(value)) [[likely]] {
127 else if (std::holds_alternative<bool>(value)) {
128 return number(std::get<bool>(value) ? 1 : 0);
130 else if (std::holds_alternative<int>(value)) {
133 else if (std::holds_alternative<double>(value)) {
137 throw std::logic_error(
"to_number: value holds no alternative" );
140 if (std::holds_alternative<std::string>(value)) [[likely]] {
144 throw std::logic_error(
"to_number: illegal parameters" );
147 throw std::logic_error(
"to_number: unknown value type " + type );
167 assert( !valueSets.empty() );
168 size_t n = valueSets.front().size();
173 for (
size_t i = 0; i < n; i++ ) {
174 for (
auto& values : valueSets ) {
176 if ( result[i].value() < values[i].value() ) {
177 result[i] = values[i];
180 else if ( !result[i].has_value() ) {
181 result[i] = values[i];
183 else if ( values[i].has_value() && values[i].value() != result[i].value() ) {
184 result[i] = std::nullopt;