From 469bbcf0701e1eb8a6670c23145b0da87357e178 Mon Sep 17 00:00:00 2001 From: Mike Buland Date: Sun, 25 Mar 2012 20:00:08 +0000 Subject: Code is all reorganized. We're about ready to release. I should write up a little explenation of the arrangement. --- src/stable/tafgroup.cpp | 224 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 224 insertions(+) create mode 100644 src/stable/tafgroup.cpp (limited to 'src/stable/tafgroup.cpp') diff --git a/src/stable/tafgroup.cpp b/src/stable/tafgroup.cpp new file mode 100644 index 0000000..ee180c3 --- /dev/null +++ b/src/stable/tafgroup.cpp @@ -0,0 +1,224 @@ +/* + * Copyright (C) 2007-2011 Xagasoft, All rights reserved. + * + * This file is part of the libbu++ library and is released under the + * terms of the license contained in the file LICENSE. + */ + +#include "bu/tafgroup.h" +#include "bu/tafproperty.h" +#include "bu/tafcomment.h" + +Bu::TafGroup::TafGroup( const TafGroup &rSrc ) : + TafNode( typeGroup ), + sName( rSrc.sName ) +{ + for( NodeList::const_iterator i = rSrc.lChildren.begin(); i; i++ ) + { + switch( (*i)->getType() ) + { + case typeGroup: + addChild( new TafGroup( *dynamic_cast(*i) ) ); + break; + + case typeProperty: + addChild( new TafProperty( *dynamic_cast(*i) ) ); + break; + + case typeComment: + addChild( new TafComment( *dynamic_cast(*i) ) ); + break; + } + } +} + +Bu::TafGroup::TafGroup( const Bu::String &sName ) : + TafNode( typeGroup ), + sName( sName ) +{ +} + +Bu::TafGroup::~TafGroup() +{ + for( NodeList::iterator i = lChildren.begin(); i != lChildren.end(); i++ ) + { + delete (*i); + } +} + +const Bu::String &Bu::TafGroup::getName() const +{ + return sName; +} + +void Bu::TafGroup::setName( const Bu::String &sName ) +{ + this->sName = sName; +} + +Bu::TafNode *Bu::TafGroup::addChild( Bu::TafNode *pNode ) +{ + switch( pNode->getType() ) + { + case typeGroup: + addChild( (Bu::TafGroup *)pNode ); + break; + + case typeProperty: + addChild( (Bu::TafProperty *)pNode ); + break; + + case typeComment: + addChild( (Bu::TafComment *)pNode ); + break; + } + + return pNode; +} + +Bu::TafGroup *Bu::TafGroup::addChild( TafGroup *pNode ) +{ + TafGroup *pGroup = (TafGroup *)pNode; + if( !hChildren.has( pGroup->getName() ) ) + hChildren.insert( pGroup->getName(), GroupList() ); + hChildren.get( pGroup->getName() ).append( pGroup ); + lChildren.append( pNode ); + return pNode; +} + +Bu::TafProperty *Bu::TafGroup::addChild( TafProperty *pNode ) +{ + TafProperty *pProperty = (TafProperty *)pNode; + if( !hProp.has( pProperty->getName() ) ) + hProp.insert( pProperty->getName(), PropList() ); + hProp.get( pProperty->getName() ).append( pProperty->getValue() ); + lChildren.append( pNode ); + return pNode; +} + +Bu::TafComment *Bu::TafGroup::addChild( TafComment *pNode ) +{ + lChildren.append( pNode ); + return pNode; +} + +Bu::TafGroup *Bu::TafGroup::addGroup( const Bu::String &sName ) +{ + return addChild( new TafGroup( sName ) ); +} + +Bu::TafProperty *Bu::TafGroup::addProperty( + const Bu::String &sName, const Bu::String &sValue ) +{ + return addChild( new TafProperty( sName, sValue ) ); +} + +bool Bu::TafGroup::hasChild( const Bu::String &sName ) const +{ + return hChildren.has( sName ); +} + +const Bu::TafGroup::GroupList &Bu::TafGroup::getChildren( const Bu::String &sName ) const +{ + try { + return hChildren.get( sName ); + } catch( Bu::HashException &e ) + { + throw Bu::TafException("No children of group \"%s\" match \"%s\".", + this->sName.getStr(), sName.getStr() ); + } +} + +const Bu::TafGroup::NodeList &Bu::TafGroup::getChildren() const +{ + return lChildren; +} + +const Bu::TafGroup *Bu::TafGroup::getChild( const Bu::String &sName ) const +{ + try { + return hChildren.get( sName ).first(); + } catch( Bu::HashException &e ) + { + throw Bu::TafException("No children of group \"%s\" match \"%s\".", + this->sName.getStr(), sName.getStr() ); + } +} + +bool Bu::TafGroup::hasProperty( const Bu::String &sName ) const +{ + return hProp.has( sName ); +} + +const Bu::TafGroup::PropList &Bu::TafGroup::getProperties( const Bu::String &sName ) const +{ + try { + return hProp.get( sName ); + } catch( Bu::HashException &e ) + { + throw Bu::TafException("No properties of group \"%s\" match \"%s\".", + this->sName.getStr(), sName.getStr() ); + } +} + +const Bu::String &Bu::TafGroup::getProperty( const Bu::String &sName ) const +{ + try { + return hProp.get( sName ).first(); + } catch( Bu::HashException &e ) + { + throw Bu::TafException("No properties of group \"%s\" match \"%s\".", + this->sName.getStr(), sName.getStr() ); + } +} + +const Bu::String &Bu::TafGroup::getProperty( const Bu::String &sName, + const Bu::String &sDef ) const +{ + try + { + return hProp.get( sName ).first(); + } + catch( Bu::HashException &e ) + { + return sDef; + } +} + +const Bu::TafGroup *Bu::TafGroup::getChildByPath( + const Bu::String &sPath ) const +{ + return getChildByPath( sPath.split('/') ); +} + +const Bu::TafGroup *Bu::TafGroup::getChildByPath( Bu::StrList lPath ) const +{ + const Bu::TafGroup *cur = this; + + for( Bu::StrList::const_iterator i = lPath.begin(); i; i++ ) + { + cur = cur->getChild( *i ); + } + + return cur; +} + +const Bu::String &Bu::TafGroup::getByPath( const Bu::String &sPath ) const +{ + return getByPath( sPath.split('/') ); +} + +const Bu::String &Bu::TafGroup::getByPath( Bu::StrList lPath ) const +{ + const Bu::TafGroup *cur = this; + + for( Bu::StrList::const_iterator i = lPath.begin(); i; i++ ) + { + if( !(i+1) ) + break; + cur = cur->getChild( *i ); + } + + return cur->getProperty( lPath.last() ); +} + -- cgit v1.2.3