xo-expression2/xo-symboltable/src/symboltable/Symbol.cpp
Roland Conybeare 3b7b80fd43 Add 'xo-symboltable/' from commit '442d24805d'
git-subtree-dir: xo-symboltable
git-subtree-mainline: 6a0e4bfeaa
git-subtree-split: 442d24805d
2025-11-18 06:47:17 -05:00

89 lines
2 KiB
C++

/** @file Symbol.cpp
*
* @author Roland Conybeare, Nov 2025
**/
#include "Symbol.hpp"
#include "xo/reflect/Reflect.hpp"
namespace xo {
using xo::reflect::Reflect;
using xo::reflect::TaggedPtr;
namespace scm {
gp<Symbol>
Symbol::make(gc::IAlloc * mm, const char * n)
{
return new (MMPtr(mm)) Symbol(mm, n);
}
Symbol::Symbol(gc::IAlloc * mm,
const char * name)
{
std::size_t nz = ::strlen(name) + 1;
assert(nz > 0);
assert(nz < 4096);
char * mem = reinterpret_cast<char *>(mm->alloc(nz));
strncpy(mem, name, nz);
this->name_ = mem;
this->name_z_ = nz;
}
// ------ Reflection helpers -----
TaggedPtr
Symbol::self_tp() const
{
return Reflect::make_tp(const_cast<Symbol *>(this));
}
void
Symbol::display(std::ostream & os) const
{
os << name_;
}
// ------ GC helpers -----
std::size_t
Symbol::_shallow_size() const
{
std::size_t retval = sizeof(Symbol);
/* note: to remove all doubt:
* in case ::strlen(name_) != name_z,
* compute string length here.
*
* Alternative would be to pass length to ctor
* + ensure that's what gets allocated
*/
retval += gc::IAlloc::with_padding(::strlen(name_) + 1);
return retval;
}
Object *
Symbol::_shallow_copy() const
{
Cpof cpof(Object::mm, this);
Symbol * copy = new (cpof) Symbol(cpof.mm_, name_);
return copy;
}
std::size_t
Symbol::_forward_children()
{
/* note: zero embedded gp<T> pointers to fixup */
return _shallow_size();
}
} /*namespace scm*/
} /*namespace xo*/
/* end Symbol.cpp */