mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-08-13 19:07:57 +00:00
Fix python binding
This commit is contained in:
@@ -73,7 +73,9 @@ namespace {
|
||||
return array_.storage_ptr->index(index_);
|
||||
} else {
|
||||
std::string str;
|
||||
array_.db_ptr->db->Get(rocksdb::ReadOptions{}, (is_entity ? "i|" : "t|") + std::to_string(instance_name_) + "|" + std::to_string(index_), &str);
|
||||
if (!array_.db_ptr->db->Get(rocksdb::ReadOptions{}, (is_entity ? "i|" : "t|") + std::to_string(instance_name_) + "|" + std::to_string(index_), &str).ok()) {
|
||||
return TypeEncoder::encode_type<boost::blank>() - 'A';
|
||||
}
|
||||
return (size_t) str[0] - 'A';
|
||||
}
|
||||
}
|
||||
|
||||
@@ -334,6 +334,54 @@ struct AttributeValue {
|
||||
unsigned int size() const;
|
||||
|
||||
IfcUtil::ArgumentType type() const;
|
||||
|
||||
template<typename Visitor>
|
||||
auto apply_visitor(Visitor&& visitor) const {
|
||||
switch (type()) {
|
||||
case IfcUtil::Argument_DERIVED:
|
||||
return visitor(Derived{});
|
||||
case IfcUtil::Argument_INT:
|
||||
return visitor((int)*this);
|
||||
case IfcUtil::Argument_BOOL:
|
||||
return visitor((bool)*this);
|
||||
case IfcUtil::Argument_LOGICAL: {
|
||||
boost::logic::tribool tb = *this;
|
||||
return visitor(tb);
|
||||
}
|
||||
case IfcUtil::Argument_DOUBLE:
|
||||
return visitor((double)*this);
|
||||
case IfcUtil::Argument_STRING:
|
||||
return visitor((std::string)*this);
|
||||
case IfcUtil::Argument_BINARY:
|
||||
return visitor((boost::dynamic_bitset<>)*this);
|
||||
case IfcUtil::Argument_ENUMERATION:
|
||||
return visitor((EnumerationReference)*this);
|
||||
case IfcUtil::Argument_ENTITY_INSTANCE:
|
||||
return visitor((IfcUtil::IfcBaseClass*)*this);
|
||||
case IfcUtil::Argument_AGGREGATE_OF_INT:
|
||||
return visitor((std::vector<int>)*this);
|
||||
case IfcUtil::Argument_AGGREGATE_OF_DOUBLE:
|
||||
return visitor((std::vector<double>)*this);
|
||||
case IfcUtil::Argument_AGGREGATE_OF_STRING:
|
||||
return visitor((std::vector<std::string>)*this);
|
||||
case IfcUtil::Argument_AGGREGATE_OF_BINARY:
|
||||
return visitor((std::vector<boost::dynamic_bitset<>>)*this);
|
||||
case IfcUtil::Argument_AGGREGATE_OF_ENTITY_INSTANCE:
|
||||
return visitor((boost::shared_ptr<aggregate_of_instance>)*this);
|
||||
case IfcUtil::Argument_AGGREGATE_OF_AGGREGATE_OF_INT:
|
||||
return visitor((std::vector<std::vector<int>>)*this);
|
||||
case IfcUtil::Argument_AGGREGATE_OF_AGGREGATE_OF_DOUBLE:
|
||||
return visitor((std::vector<std::vector<double>>)*this);
|
||||
case IfcUtil::Argument_AGGREGATE_OF_AGGREGATE_OF_ENTITY_INSTANCE:
|
||||
return visitor((boost::shared_ptr<aggregate_of_aggregate_of_instance>)*this);
|
||||
case IfcUtil::Argument_EMPTY_AGGREGATE:
|
||||
return visitor(empty_aggregate_t{});
|
||||
case IfcUtil::Argument_AGGREGATE_OF_EMPTY_AGGREGATE:
|
||||
return visitor(empty_aggregate_of_aggregate_t{});
|
||||
default:
|
||||
return visitor(Blank{});
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
struct rocks_db_attribute_storage {
|
||||
|
||||
@@ -344,7 +344,7 @@ IfcUtil::IfcBaseClass* IfcParse::impl::rocks_db_file_storage::rocksdb_instance_i
|
||||
}
|
||||
*/
|
||||
|
||||
const IfcParse::declaration* IfcParse::impl::rocks_db_file_storage::rocksdb_types_iterator::operator*() const {
|
||||
IfcParse::impl::rocks_db_file_storage::rocksdb_types_iterator::value_type const& IfcParse::impl::rocks_db_file_storage::rocksdb_types_iterator::operator*() const {
|
||||
return storage_->file->schema()->declarations()[*read_id_()];
|
||||
}
|
||||
|
||||
|
||||
+10
-8
@@ -135,6 +135,8 @@ struct parse_context {
|
||||
#include <vector>
|
||||
#include <list>
|
||||
|
||||
#ifndef SWIG
|
||||
|
||||
template <typename... Iterators>
|
||||
class variant_iterator {
|
||||
public:
|
||||
@@ -211,6 +213,8 @@ private:
|
||||
variant_type it_;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
namespace impl {
|
||||
struct in_memory_file_storage {
|
||||
IfcParse::IfcSpfLexer* tokens;
|
||||
@@ -236,7 +240,7 @@ namespace impl {
|
||||
in_memory_file_storage(const in_memory_file_storage&) = delete;
|
||||
in_memory_file_storage(const in_memory_file_storage&&) = delete;
|
||||
|
||||
class type_iterator : private entities_by_type_t::const_iterator {
|
||||
class type_iterator : public entities_by_type_t::const_iterator {
|
||||
public:
|
||||
using iterator_category = std::forward_iterator_tag;
|
||||
using value_type = entities_by_type_t::key_type;
|
||||
@@ -267,12 +271,6 @@ namespace impl {
|
||||
operator++();
|
||||
return tmp;
|
||||
}
|
||||
|
||||
bool operator!=(const type_iterator& other) const {
|
||||
const entities_by_type_t::const_iterator& self_ = *this;
|
||||
const entities_by_type_t::const_iterator& other_ = other;
|
||||
return self_ != other_;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -547,7 +545,11 @@ namespace impl {
|
||||
return !(*this == other);
|
||||
}
|
||||
|
||||
const IfcParse::declaration* operator*() const;
|
||||
value_type const& operator*() const;
|
||||
|
||||
value_type const* operator->() const {
|
||||
return &operator*();
|
||||
}
|
||||
};
|
||||
|
||||
// @todo rocksdb_instance_iterator?
|
||||
|
||||
@@ -2310,12 +2310,11 @@ IfcUtil::IfcBaseClass* IfcFile::instance_by_guid(const std::string& guid) {
|
||||
IfcFile::type_iterator IfcFile::types_begin() const {
|
||||
return std::visit([](const auto& x) {
|
||||
if constexpr (std::is_same_v<std::decay_t<decltype(x)>, std::monostate>) {
|
||||
throw std::runtime_error("Storage not initialized");
|
||||
return (IfcFile::type_iterator) impl::rocks_db_file_storage::rocksdb_types_iterator{};
|
||||
return IfcFile::type_iterator{ impl::rocks_db_file_storage::rocksdb_types_iterator{} };
|
||||
} else if constexpr (std::is_same_v<std::decay_t<decltype(x)>, impl::in_memory_file_storage>) {
|
||||
return (IfcFile::type_iterator) x.bytype_excl_.begin();
|
||||
return IfcFile::type_iterator{ x.bytype_excl_.begin() };
|
||||
} else if constexpr (std::is_same_v<std::decay_t<decltype(x)>, impl::rocks_db_file_storage>) {
|
||||
return (IfcFile::type_iterator) impl::rocks_db_file_storage::rocksdb_types_iterator(&x);
|
||||
return IfcFile::type_iterator{ impl::rocks_db_file_storage::rocksdb_types_iterator(&x) };
|
||||
}
|
||||
}, storage_);
|
||||
}
|
||||
@@ -2323,12 +2322,11 @@ IfcFile::type_iterator IfcFile::types_begin() const {
|
||||
IfcFile::type_iterator IfcFile::types_end() const {
|
||||
return std::visit([](const auto& x) {
|
||||
if constexpr (std::is_same_v<std::decay_t<decltype(x)>, std::monostate>) {
|
||||
throw std::runtime_error("Storage not initialized");
|
||||
return (IfcFile::type_iterator)impl::rocks_db_file_storage::rocksdb_types_iterator{};
|
||||
return IfcFile::type_iterator{ impl::rocks_db_file_storage::rocksdb_types_iterator{} };
|
||||
} else if constexpr (std::is_same_v<std::decay_t<decltype(x)>, impl::in_memory_file_storage>) {
|
||||
return (IfcFile::type_iterator)x.bytype_excl_.end();
|
||||
return IfcFile::type_iterator{ x.bytype_excl_.end() };
|
||||
} else if constexpr (std::is_same_v<std::decay_t<decltype(x)>, impl::rocks_db_file_storage>) {
|
||||
return (IfcFile::type_iterator)impl::rocks_db_file_storage::rocksdb_types_iterator{};
|
||||
return IfcFile::type_iterator{ impl::rocks_db_file_storage::rocksdb_types_iterator{} };
|
||||
}
|
||||
}, storage_);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user