/******************************************************************************** * * * This file is part of IfcOpenShell. * * * * IfcOpenShell is free software: you can redistribute it and/or modify * * it under the terms of the Lesser GNU General Public License as published by * * the Free Software Foundation, either version 3.0 of the License, or * * (at your option) any later version. * * * * IfcOpenShell is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * Lesser GNU General Public License for more details. * * * * You should have received a copy of the Lesser GNU General Public License * * along with this program. If not, see . * * * ********************************************************************************/ #ifndef IFCENTITYINSTANCEDATA_H #define IFCENTITYINSTANCEDATA_H #include "../ifcparse/ArgumentType.h" #include #include class Argument; class IfcEntityList; namespace IfcParse { class IfcFile; } class IFC_PARSE_API IfcEntityInstanceData { public: // Public for backwards compatibility IfcParse::IfcFile* file; protected: unsigned id_; IfcSchema::Type::Enum type_; mutable std::vector attributes_; // To reduce memory footprint, these two could potentially be combined, // e.g. initialized_ <-> offset_in_file_ == 0, but it would imply that // instances cannot be located at the beginning of the file. Officially // there should be a header anyways. mutable bool initialized_; unsigned offset_in_file_; public: IfcEntityInstanceData(IfcSchema::Type::Enum type, IfcParse::IfcFile* file_, unsigned id = 0, unsigned offset_in_file = 0) : file(file_), id_(id), type_(type), initialized_(false), offset_in_file_(offset_in_file) {} IfcEntityInstanceData(IfcSchema::Type::Enum type) : file(0), id_(0), type_(type), initialized_(true) {} /* IfcEntityInstanceData(IfcParse::IfcFile* file = 0, unsigned id = 0, IfcSchema::Type::Enum type = IfcSchema::Type::UNDEFINED, unsigned offset_in_file = 0, size_t n) : file_(file), id_(0), type_(type), initialized_(false) { attributes_.reserve(n); } IfcEntityInstanceData(IfcParse::IfcFile* file = 0, unsigned id = 0, IfcSchema::Type::Enum type = IfcSchema::Type::UNDEFINED, const std::vector& attributes) : file_(file), id_(0), type_(type), attributes_(attributes), initialized_(true) {} */ void load() const; IfcEntityInstanceData(const IfcEntityInstanceData& e); ~IfcEntityInstanceData(); boost::shared_ptr getInverse(IfcSchema::Type::Enum type, int attribute_index); Argument* getArgument(unsigned int i) const; // NB: This makes a copy of the argument void setArgument(unsigned int i, Argument* a, IfcUtil::ArgumentType attr_type = IfcUtil::Argument_UNKNOWN); unsigned int getArgumentCount() const { if (!initialized_) { load(); } return (unsigned int)attributes_.size(); } IfcSchema::Type::Enum type() const { return type_; } std::string toString(bool upper = false) const; unsigned int id() const { return id_; } unsigned int offset_in_file() const { return offset_in_file_; } // NB: const ommitted for lazy loading std::vector& attributes() const { return attributes_; } unsigned set_id(boost::optional i = boost::none); }; #endif