2015-01-31 10:07:48 +00:00
|
|
|
/*-----------------------------------------------------------------------------------------------
|
|
|
|
The MIT License (MIT)
|
|
|
|
|
2015-04-16 09:09:54 +00:00
|
|
|
Copyright (c) 2014-2015 Kim Kulling
|
2015-01-31 10:07:48 +00:00
|
|
|
|
|
|
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
|
|
this software and associated documentation files (the "Software"), to deal in
|
|
|
|
the Software without restriction, including without limitation the rights to
|
|
|
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
|
|
|
the Software, and to permit persons to whom the Software is furnished to do so,
|
|
|
|
subject to the following conditions:
|
|
|
|
|
|
|
|
The above copyright notice and this permission notice shall be included in all
|
|
|
|
copies or substantial portions of the Software.
|
|
|
|
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
|
|
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
|
|
|
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
|
|
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
|
|
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
-----------------------------------------------------------------------------------------------*/
|
|
|
|
#include <openddlparser/DDLNode.h>
|
|
|
|
#include <openddlparser/OpenDDLParser.h>
|
|
|
|
|
|
|
|
#include <algorithm>
|
|
|
|
|
|
|
|
BEGIN_ODDLPARSER_NS
|
|
|
|
|
|
|
|
DDLNode::DllNodeList DDLNode::s_allocatedNodes;
|
|
|
|
|
|
|
|
template<class T>
|
|
|
|
inline
|
|
|
|
static void releaseDataType( T *ptr ) {
|
2015-01-31 10:46:13 +00:00
|
|
|
if( ddl_nullptr == ptr ) {
|
2015-01-31 10:07:48 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2015-01-31 10:46:13 +00:00
|
|
|
T *current( ddl_nullptr );
|
2015-01-31 10:07:48 +00:00
|
|
|
while( ptr ) {
|
|
|
|
current = ptr;
|
|
|
|
ptr = ptr->m_next;
|
|
|
|
delete current;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-03-17 13:25:15 +00:00
|
|
|
static void releaseReferencedNames( Reference *ref ) {
|
|
|
|
if( ddl_nullptr == ref ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if( ref->m_referencedName ) {
|
|
|
|
for( size_t i = 0; i < ref->m_numRefs; i++ ) {
|
|
|
|
delete ref->m_referencedName;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-01-31 10:07:48 +00:00
|
|
|
DDLNode::DDLNode( const std::string &type, const std::string &name, size_t idx, DDLNode *parent )
|
|
|
|
: m_type( type )
|
|
|
|
, m_name( name )
|
|
|
|
, m_parent( parent )
|
|
|
|
, m_children()
|
2015-01-31 10:46:13 +00:00
|
|
|
, m_properties( ddl_nullptr )
|
|
|
|
, m_value( ddl_nullptr )
|
2015-03-09 09:17:23 +00:00
|
|
|
, m_dtArrayList( ddl_nullptr )
|
2015-03-17 13:25:15 +00:00
|
|
|
, m_references( ddl_nullptr )
|
|
|
|
, m_idx( idx ) {
|
2015-01-31 10:07:48 +00:00
|
|
|
if( m_parent ) {
|
|
|
|
m_parent->m_children.push_back( this );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
DDLNode::~DDLNode() {
|
|
|
|
releaseDataType<Property>( m_properties );
|
|
|
|
releaseDataType<Value>( m_value );
|
2015-03-17 13:25:15 +00:00
|
|
|
releaseReferencedNames( m_references );
|
2015-01-31 10:07:48 +00:00
|
|
|
|
|
|
|
delete m_dtArrayList;
|
2015-01-31 10:46:13 +00:00
|
|
|
m_dtArrayList = ddl_nullptr;
|
2015-01-31 10:07:48 +00:00
|
|
|
if( s_allocatedNodes[ m_idx ] == this ) {
|
2015-01-31 10:46:13 +00:00
|
|
|
s_allocatedNodes[ m_idx ] = ddl_nullptr;
|
2015-01-31 10:07:48 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void DDLNode::attachParent( DDLNode *parent ) {
|
|
|
|
if( m_parent == parent ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
m_parent = parent;
|
2015-01-31 10:46:13 +00:00
|
|
|
if( ddl_nullptr != m_parent ) {
|
2015-01-31 10:07:48 +00:00
|
|
|
m_parent->m_children.push_back( this );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void DDLNode::detachParent() {
|
|
|
|
if( m_parent ) {
|
|
|
|
std::vector<DDLNode*>::iterator it;
|
|
|
|
it = std::find( m_parent->m_children.begin(), m_parent->m_children.end(), this );
|
|
|
|
if( m_parent->m_children.end() != it ) {
|
|
|
|
m_parent->m_children.erase( it );
|
|
|
|
}
|
2015-01-31 10:46:13 +00:00
|
|
|
m_parent = ddl_nullptr;
|
2015-01-31 10:07:48 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
DDLNode *DDLNode::getParent() const {
|
|
|
|
return m_parent;
|
|
|
|
}
|
|
|
|
|
|
|
|
const DDLNode::DllNodeList &DDLNode::getChildNodeList() const {
|
|
|
|
return m_children;
|
|
|
|
}
|
|
|
|
|
|
|
|
void DDLNode::setType( const std::string &type ) {
|
|
|
|
m_type = type;
|
|
|
|
}
|
|
|
|
|
|
|
|
const std::string &DDLNode::getType() const {
|
|
|
|
return m_type;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void DDLNode::setName( const std::string &name ) {
|
|
|
|
m_name = name;
|
|
|
|
}
|
|
|
|
|
|
|
|
const std::string &DDLNode::getName() const {
|
|
|
|
return m_name;
|
|
|
|
}
|
|
|
|
|
2015-02-07 11:47:53 +00:00
|
|
|
void DDLNode::setProperties( Property *prop ) {
|
|
|
|
m_properties = prop;
|
|
|
|
}
|
|
|
|
|
|
|
|
Property *DDLNode::getProperties() const {
|
|
|
|
return m_properties;
|
|
|
|
}
|
|
|
|
|
2015-04-16 09:09:54 +00:00
|
|
|
bool DDLNode::hasProperty( const std::string &name ) {
|
|
|
|
const Property *prop( findPropertyByName( name ) );
|
|
|
|
return ( ddl_nullptr != prop );
|
|
|
|
}
|
|
|
|
|
|
|
|
Property *DDLNode::findPropertyByName( const std::string &name ) {
|
|
|
|
if( name.empty() ) {
|
|
|
|
return ddl_nullptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
if( ddl_nullptr == m_properties ) {
|
|
|
|
return ddl_nullptr;
|
|
|
|
}
|
|
|
|
Property *current( m_properties );
|
|
|
|
while( ddl_nullptr != current ) {
|
|
|
|
int res = strncmp( current->m_id->m_buffer, name.c_str(), name.size() );
|
|
|
|
if( 0 == res ) {
|
|
|
|
return current;
|
|
|
|
}
|
|
|
|
current = current->m_next;
|
|
|
|
}
|
|
|
|
|
|
|
|
return ddl_nullptr;
|
|
|
|
}
|
|
|
|
|
2015-01-31 10:07:48 +00:00
|
|
|
void DDLNode::setValue( Value *val ) {
|
|
|
|
m_value = val;
|
|
|
|
}
|
|
|
|
|
|
|
|
Value *DDLNode::getValue() const {
|
|
|
|
return m_value;
|
|
|
|
}
|
|
|
|
|
|
|
|
void DDLNode::setDataArrayList( DataArrayList *dtArrayList ) {
|
|
|
|
m_dtArrayList = dtArrayList;
|
|
|
|
}
|
|
|
|
|
|
|
|
DataArrayList *DDLNode::getDataArrayList() const {
|
|
|
|
return m_dtArrayList;
|
|
|
|
}
|
|
|
|
|
2015-03-09 09:17:23 +00:00
|
|
|
void DDLNode::setReferences( Reference *refs ) {
|
|
|
|
m_references = refs;
|
|
|
|
}
|
|
|
|
|
|
|
|
Reference *DDLNode::getReferences() const {
|
|
|
|
return m_references;
|
|
|
|
}
|
|
|
|
|
2015-01-31 10:07:48 +00:00
|
|
|
DDLNode *DDLNode::create( const std::string &type, const std::string &name, DDLNode *parent ) {
|
|
|
|
const size_t idx( s_allocatedNodes.size() );
|
|
|
|
DDLNode *node = new DDLNode( type, name, idx, parent );
|
|
|
|
s_allocatedNodes.push_back( node );
|
|
|
|
|
|
|
|
return node;
|
|
|
|
}
|
|
|
|
|
|
|
|
void DDLNode::releaseNodes() {
|
|
|
|
if( s_allocatedNodes.size() > 0 ) {
|
|
|
|
for( DllNodeList::iterator it = s_allocatedNodes.begin(); it != s_allocatedNodes.end(); it++ ) {
|
|
|
|
if( *it ) {
|
|
|
|
delete *it;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
s_allocatedNodes.clear();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
END_ODDLPARSER_NS
|