Files
libreoffice/autodoc/source/ary/inc/nametreenode.hxx
Rüdiger Timm 138be272bc INTEGRATION: CWS ooo19126 (1.4.24); FILE MERGED
2005/09/05 13:10:14 rt 1.4.24.1: #i54170# Change license header: remove SISSL
2005-09-07 15:59:54 +00:00

237 lines
7.0 KiB
C++

/*************************************************************************
*
* OpenOffice.org - a multi-platform office productivity suite
*
* $RCSfile: nametreenode.hxx,v $
*
* $Revision: 1.5 $
*
* last change: $Author: rt $ $Date: 2005-09-07 16:59:54 $
*
* The Contents of this file are made available subject to
* the terms of GNU Lesser General Public License Version 2.1.
*
*
* GNU Lesser General Public License Version 2.1
* =============================================
* Copyright 2005 by Sun Microsystems, Inc.
* 901 San Antonio Road, Palo Alto, CA 94303, USA
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1, as published by the Free Software Foundation.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*
************************************************************************/
#ifndef ARY_NAMETREENODE_HXX
#define ARY_NAMETREENODE_HXX
// USED SERVICES
// BASE CLASSES
// COMPONENTS
// PARAMETERS
#include <cosv/template/tpltools.hxx>
#include <sci_impl.hxx>
// HACK because of SunPro 5.2 compiler bug with templates:
#include <ary/idl/i_module.hxx>
namespace ary
{
/** Implementation of a node in a namespace-tree.
*/
template<class ITEM_ID>
class NameTreeNode
{
public:
typedef NameTreeNode self;
typedef ITEM_ID item_id;
typedef StringVector::const_iterator name_iterator;
typedef std::map<String, item_id> Map_LocalNames;
// LIFECYCLE
NameTreeNode();
NameTreeNode(
const String & i_sName,
const self & i_rParent,
ITEM_ID i_nParentId );
virtual ~NameTreeNode();
// OPERATIONS
void Add_Name(
const String & i_sName,
item_id i_nId );
// INQUIRY
const String & Name() const { return Depth() > 0 ? aCompleteNameChain.back() : String::Null_(); }
item_id Parent() const { return nParent; }
intt Depth() const { return aCompleteNameChain.size(); }
bool IsEquivalent(
const NameTreeNode &
i_rNode ) const;
name_iterator NameChain_Begin() const { return aCompleteNameChain.begin(); }
name_iterator NameChain_End() const { return aCompleteNameChain.end(); }
item_id Search_Name(
const String & i_sName ) const;
void Get_Names(
Dyn_StdConstIterator<ITEM_ID> &
o_rResult ) const;
const Map_LocalNames &
LocalNames() const { return aLocalNames; }
private:
// Locals
Map_LocalNames & LocalNames() { return aLocalNames; }
// DATA
Map_LocalNames aLocalNames;
StringVector aCompleteNameChain;
item_id nParent;
};
#if 0
// Prototypes have to be left out, because of a VC++ 6 compiler bug
// ( compiler reports ambiguous overload ).
template <class FIND_NODE>
typename FIND_NODE::id_type
Search_SubTree( const typename FIND_NODE::node_type & i_rStart,
const FIND_NODE & i_rNodeFinder );
template <class FIND_NODE>
typename FIND_NODE::id_type
Search_SubTree_UpTillRoot( const typename FIND_NODE::node_type & i_rStart,
const FIND_NODE & i_rNodeFinder );
#endif // 0
// IMPLEMENTATION
template<class ITEM_ID>
NameTreeNode<ITEM_ID>::NameTreeNode()
: aLocalNames(),
aCompleteNameChain(),
nParent(0)
{
}
template<class ITEM_ID>
NameTreeNode<ITEM_ID>::NameTreeNode( const String & i_sName,
const self & i_rParent,
ITEM_ID i_nParentId )
: aLocalNames(),
aCompleteNameChain(),
nParent(i_nParentId)
{
aCompleteNameChain.reserve(i_rParent.Depth()+1);
for ( name_iterator it = i_rParent.NameChain_Begin();
it != i_rParent.NameChain_End();
++it )
{
aCompleteNameChain.push_back(*it);
}
aCompleteNameChain.push_back(i_sName);
}
template<class ITEM_ID>
NameTreeNode<ITEM_ID>::~NameTreeNode()
{
}
template<class ITEM_ID>
inline void
NameTreeNode<ITEM_ID>::Add_Name( const String & i_sName,
item_id i_nId )
{
LocalNames().insert( typename Map_LocalNames::value_type(i_sName, i_nId) );
}
template<class ITEM_ID>
inline bool
NameTreeNode<ITEM_ID>::IsEquivalent( const NameTreeNode & i_rNode ) const
{
return aCompleteNameChain == i_rNode.aCompleteNameChain;
}
template<class ITEM_ID>
inline ITEM_ID
NameTreeNode<ITEM_ID>::Search_Name( const String & i_sName ) const
{
return csv::value_from_map(LocalNames(),i_sName);
}
template<class ITEM_ID>
inline void
NameTreeNode<ITEM_ID>::Get_Names( Dyn_StdConstIterator<ITEM_ID> & o_rResult ) const
{
o_rResult = new SCI_DataInMap<String,item_id>(LocalNames());
}
// HACK because of SunPro 5.2 compiler bug with templates:
// ary::idl::Module has to be "FIND_NODE::node_type"
// must be solved later somehow.
template <class FIND_NODE>
typename FIND_NODE::id_type
Search_SubTree( const ary::idl::Module & i_rStart,
const FIND_NODE & i_rNodeFinder )
{
const typename FIND_NODE::node_type *
ret = &i_rStart;
for ( StringVector::const_iterator it = i_rNodeFinder.Begin();
it != i_rNodeFinder.End() AND ret != 0;
++it )
{
ret = i_rNodeFinder(ret->Search_Name(*it));
}
typename FIND_NODE::id_type nret(0);
return ret != 0
? ret->Search_Name(i_rNodeFinder.Name2Search())
: nret;
}
template <class FIND_NODE>
typename FIND_NODE::id_type
Search_SubTree_UpTillRoot( const ary::idl::Module & i_rStart,
const FIND_NODE & i_rNodeFinder )
{
typename FIND_NODE::id_type
ret(0);
for ( const typename FIND_NODE::node_type * start = &i_rStart;
start != 0 AND NOT ret.IsValid();
start = i_rNodeFinder(start->Owner()) )
{
ret = Search_SubTree( *start,
i_rNodeFinder );
}
return ret;
}
// END Hack for SunPro 5.2 compiler bug.
} // namespace ary
#endif