mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-20 06:58:56 +00:00
Bool to logical upgrade
This commit is contained in:
@@ -45,6 +45,9 @@ AttributeValue::operator double() const
|
|||||||
|
|
||||||
AttributeValue::operator boost::logic::tribool() const
|
AttributeValue::operator boost::logic::tribool() const
|
||||||
{
|
{
|
||||||
|
if (array_->has<bool>(index_)) {
|
||||||
|
return array_->get<bool>(index_);
|
||||||
|
}
|
||||||
return array_->get<boost::logic::tribool>(index_);
|
return array_->get<boost::logic::tribool>(index_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#include "IfcFile.h"
|
#include "IfcFile.h"
|
||||||
|
#include "IfcLogger.h"
|
||||||
|
|
||||||
IfcParse::parse_context::~parse_context() {
|
IfcParse::parse_context::~parse_context() {
|
||||||
for (auto& t : tokens_) {
|
for (auto& t : tokens_) {
|
||||||
@@ -25,19 +26,15 @@ void IfcParse::parse_context::push(IfcUtil::IfcBaseClass* inst) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
// Define a template to check if a type is in a boost::variant
|
|
||||||
template<typename Variant, typename T>
|
template<typename Variant, typename T>
|
||||||
struct is_type_in_variant;
|
struct is_type_in_variant;
|
||||||
|
|
||||||
// Specialization for boost::variant
|
|
||||||
template<typename T, typename... Types>
|
template<typename T, typename... Types>
|
||||||
struct is_type_in_variant<boost::variant<Types...>, T>
|
struct is_type_in_variant<boost::variant<Types...>, T>
|
||||||
{
|
{
|
||||||
// Recursive template to check if T is one of Types
|
|
||||||
static constexpr bool value = (std::is_same<T, Types>::value || ...);
|
static constexpr bool value = (std::is_same<T, Types>::value || ...);
|
||||||
};
|
};
|
||||||
|
|
||||||
// Helper variable template (C++14 and beyond)
|
|
||||||
template<typename Variant, typename T>
|
template<typename Variant, typename T>
|
||||||
constexpr bool is_type_in_variant_v = is_type_in_variant<Variant, T>::value;
|
constexpr bool is_type_in_variant_v = is_type_in_variant<Variant, T>::value;
|
||||||
|
|
||||||
@@ -118,16 +115,41 @@ namespace {
|
|||||||
if (aggregate_storage.which() == 0) {
|
if (aggregate_storage.which() == 0) {
|
||||||
aggregate_storage = std::vector<std::decay_t<decltype(v)>>{ v };
|
aggregate_storage = std::vector<std::decay_t<decltype(v)>>{ v };
|
||||||
} else {
|
} else {
|
||||||
auto* vec_ptr = boost::get< std::vector<std::decay_t<decltype(v)>>>(&aggregate_storage);
|
auto* vec_ptr = boost::get<std::vector<std::decay_t<decltype(v)>>>(&aggregate_storage);
|
||||||
if (vec_ptr) {
|
if (vec_ptr) {
|
||||||
vec_ptr->push_back(v);
|
vec_ptr->push_back(v);
|
||||||
} else {
|
} else {
|
||||||
// inconsistent aggregate valuation
|
// @todo would be cool if we can trace this back to file offset
|
||||||
|
auto current = boost::apply_visitor([](auto v) {
|
||||||
|
if constexpr (!std::is_same_v<decltype(v), Blank>) {
|
||||||
|
return std::string(typeid(typename decltype(v)::value_type).name());
|
||||||
|
} else {
|
||||||
|
// Cannot occur as aggregate_storage.which() == 0
|
||||||
|
// is another branch several statements up. But is
|
||||||
|
// needed for consistency of return type.
|
||||||
|
return std::string{};
|
||||||
|
}
|
||||||
|
}, aggregate_storage);
|
||||||
|
Logger::Error("Inconsistent aggregate valuation while attempting to append " + std::string(typeid(decltype(v)).name()) + " to an aggregate of " + current);
|
||||||
|
|
||||||
// @todo boolean -> logical upgrade
|
// @todo boolean -> logical upgrade
|
||||||
|
// wait a second... there are no aggregate of bool / logical in the schema..
|
||||||
|
//
|
||||||
|
// if constexpr (std::is_same_v<std::decay_t<decltype(v)>, bool>) {
|
||||||
|
// auto* vec_ptr = boost::get<std::vector<boost::tribool>(&aggregate_storage);
|
||||||
|
// vec_ptr->push_back(v);
|
||||||
|
// }
|
||||||
|
// if constexpr (std::is_same_v<std::decay_t<decltype(v)>, boost::tribool>) {
|
||||||
|
// auto* vec_ptr = boost::get<std::vector<bool>(&aggregate_storage);
|
||||||
|
// std::vector<boost::tribool> ps(vec_ptr->begin(), vec_ptr->end());
|
||||||
|
// ps.push_back(v);
|
||||||
|
// aggregate_storage = ps;
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// unsupported aggregate type
|
// @todo would be cool if we can trace this back to file offset
|
||||||
|
Logger::Error(std::string("Aggregates of ") + typeid(decltype(v)).name() + " are not supported in the IfcOpenShell parser");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user