#pragma once #include #include #include #include namespace DB { /// Access entity is a set of data which have a name and a type. Access entity control something related to the access control. /// Entities can be stored to a file or another storage, see IAccessStorage. struct IAccessEntity { IAccessEntity() = default; IAccessEntity(const IAccessEntity &) = default; virtual ~IAccessEntity() = default; virtual std::shared_ptr clone() const = 0; std::type_index getType() const { return typeid(*this); } static String getTypeName(std::type_index type); const String getTypeName() const { return getTypeName(getType()); } static const char * getKeyword(std::type_index type); const char * getKeyword() const { return getKeyword(getType()); } template bool isTypeOf() const { return isTypeOf(typeid(EntityType)); } bool isTypeOf(std::type_index type) const { return type == getType(); } virtual void setName(const String & name_) { full_name = name_; } virtual String getName() const { return full_name; } String getFullName() const { return full_name; } friend bool operator ==(const IAccessEntity & lhs, const IAccessEntity & rhs) { return lhs.equal(rhs); } friend bool operator !=(const IAccessEntity & lhs, const IAccessEntity & rhs) { return !(lhs == rhs); } protected: String full_name; virtual bool equal(const IAccessEntity & other) const; /// Helper function to define clone() in the derived classes. template std::shared_ptr cloneImpl() const { return std::make_shared(typeid_cast(*this)); } }; using AccessEntityPtr = std::shared_ptr; }