/*
    MultiNode sample code
    Henry Smith (henry@enigmasoftware.ca)
*/


#include "MultiNodeImpl.h"
#include "NodeImpl.h"

FamilyID MultiNodeImpl::sCurrentFamily = 0;

MultiNodeImpl::MultiNodeImpl ()
{
}

MultiNodeImpl::~MultiNodeImpl ()
{
}

const MultiNodeRef&
MultiNodeImpl::Parent () const
{
    return GetImpl()->mParent;
}

const MultiNodeRef&
MultiNodeImpl::Child () const
{
    return GetImpl()->mChild;
}

const MultiNodeRef&
MultiNodeImpl::Sibling () const
{
    return GetImpl()->mSibling;
}

MultiNodeRef&
MultiNodeImpl::Parent ()
{
    return GetImpl()->mParent;
}

MultiNodeRef&
MultiNodeImpl::Child ()
{
    return GetImpl()->mChild;
}

MultiNodeRef&
MultiNodeImpl::Sibling ()
{
    return GetImpl()->mSibling;
}

NodeImpl*
MultiNodeImpl::GetImpl () const
{
    NodeImplMap::iterator result = mImpls.find (sCurrentFamily);

    // If there is no impl for the current family, create one

    if (result == mImpls.end()) {
        result = mImpls.insert( std::make_pair( sCurrentFamily, NodeImpl() ) ).first;
    }
    return &(result->second);
}