80 if (std::holds_alternative<std::string>(value)) {
83 else if (std::holds_alternative<bool>(value)) [[likely]] {
84 return number(std::get<bool>(value) ? 1 : 0);
86 else if (std::holds_alternative<int>(value)) {
87 return number(std::get<int>(value) ? 1 : 0);
89 else if (std::holds_alternative<double>(value)) {
90 return number(std::get<double>(value) ? 1 : 0);
93 throw std::logic_error(
"to_number: value holds no alternative" );
96 if (std::holds_alternative<std::string>(value)) {
99 else if (std::holds_alternative<bool>(value)) {
100 return number(std::get<bool>(value) ? 1 : 0);
102 else if (std::holds_alternative<int>(value)) [[likely]] {
103 return number(std::get<int>(value));
105 else if (std::holds_alternative<double>(value)) {
106 return number((
int)std::get<double>(value));
109 throw std::logic_error(
"to_number: value holds no alternative" );
112 if (std::holds_alternative<std::string>(value)) {
115 else if (std::holds_alternative<bool>(value)) {
116 return number(std::get<bool>(value) ? 1 : 0);
118 else if (std::holds_alternative<int>(value)) {
119 return number(std::get<int>(value));
121 else if (std::holds_alternative<double>(value)) [[likely]] {
122 return number(std::get<double>(value));
125 throw std::logic_error(
"to_number: value holds no alternative" );
128 if (std::holds_alternative<std::string>(value)) [[likely]] {
131 else if (std::holds_alternative<bool>(value)) {
132 return number(std::get<bool>(value) ? 1 : 0);
134 else if (std::holds_alternative<int>(value)) {
137 else if (std::holds_alternative<double>(value)) {
141 throw std::logic_error(
"to_number: value holds no alternative" );
144 if (std::holds_alternative<std::string>(value)) [[likely]] {
148 throw std::logic_error(
"to_number: illegal conversion" );
151 throw std::logic_error(
"to_number: unknown value type " + type );
190 assert( !valueSets.empty() );
191 size_t n = valueSets.front().size();
196 for (
size_t i = 0; i < n; i++ ) {
197 for (
auto& values : valueSets ) {
199 if ( result[i].value() < values[i].value() ) {
200 result[i] = values[i];
203 else if ( !result[i].has_value() ) {
204 result[i] = values[i];
206 else if ( values[i].has_value() && values[i].value() != result[i].value() ) {
207 result[i] = std::nullopt;