Poor man's RTTI is mostly gone.
Some checks failed
CI / ubuntu-latest-html-tests (push) Has been cancelled
CI / ubuntu-latest-no-tls (push) Has been cancelled
CI / ubuntu-latest-mbedtls2 (push) Has been cancelled
CI / ubuntu-latest-openssl-3 (push) Has been cancelled
CI / ubuntu-latest-with-old-std (push) Has been cancelled
CI / ubuntu-20-04-openssl-1-1 (push) Has been cancelled
CI / alpine-mbedtls-3_6_0 (push) Has been cancelled
CI / macOS-13-openssl-1-1 (push) Has been cancelled
CI / macOS-13-openssl-3 (push) Has been cancelled
CI / freebsd-14-openssl-3 (push) Has been cancelled
CI / windows-mbedtls (push) Has been cancelled

I'm keeping the type-index to name mapping, for now.
This commit is contained in:
2025-08-09 06:31:08 -04:00
parent f69784c518
commit 8549ca489f
26 changed files with 27 additions and 216 deletions

View File

@ -24,47 +24,7 @@
namespace lout {
namespace identity {
// ------------------------
// IdentifiableObject
// ------------------------
using namespace object;
using namespace container::typed;
IdentifiableObject::Class::Class (IdentifiableObject::Class *parent, const std::type_index id,
const char *className)
: id( (std::intptr_t) id.name() )
{
this->parent = parent;
this->className = className;
}
void IdentifiableObject::Class::intoStringBuffer(misc::StringBuffer *sb)
{
sb->append ("<class ");
sb->append (className);
sb->append (" (");
sb->appendInt (id);
sb->append (")");
if (parent) {
sb->append (", parent: ");
parent->intoStringBuffer (sb);
}
sb->append (">");
}
std::map< std::string, std::unique_ptr< IdentifiableObject::Class > > IdentifiableObject::classesByName;
std::map< std::intptr_t, IdentifiableObject::Class * > IdentifiableObject::classesById;
IdentifiableObject::Class *IdentifiableObject::currentlyConstructedClass;
IdentifiableObject::IdentifiableObject ()
{
currentlyConstructedClass = NULL;
}
std::map< std::type_index, std::string > IdentifiableObject::classNames;
void IdentifiableObject::intoStringBuffer(misc::StringBuffer *sb)
{
@ -76,23 +36,12 @@ void IdentifiableObject::intoStringBuffer(misc::StringBuffer *sb)
}
/**
* \brief This method must be called in the constructor for the sub class.
* See class comment for details.
* Register a name for a class.
*/
void IdentifiableObject::registerName (const char *className, const std::type_index index, std::intptr_t *classId)
void
IdentifiableObject::registerName( const char *const className, const std::type_index index )
{
if (not classesByName.contains( className )) {
classesByName.emplace( className,
std::make_unique< Class >( currentlyConstructedClass, index, className ) );
auto *const klass= classesByName.at( className ).get();
classesById[ klass->id ]= klass;
*classId = klass->id;
}
Class *const klass = classesByName.at( className ).get();
this->classId = klass->id;
*classId = klass->id;
currentlyConstructedClass = klass;
classNames.insert( { index, className } );
}
} // namespace identity