Files
libreoffice/autodoc/source/ary/inc/sortedids.hxx
Jens-Heiner Rechtien 2afe39e237 INTEGRATION: CWS adc18 (1.1.2); FILE ADDED
2007/10/19 11:19:56 np 1.1.2.2: #i81775#
2007/10/18 15:07:29 np 1.1.2.1: #i81775#
2007-11-02 15:03:22 +00:00

246 lines
6.3 KiB
C++

/*************************************************************************
*
* OpenOffice.org - a multi-platform office productivity suite
*
* $RCSfile: sortedids.hxx,v $
*
* $Revision: 1.2 $
*
* last change: $Author: hr $ $Date: 2007-11-02 16:03:22 $
*
* 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_SORTEDIDS_HXX
#define ARY_SORTEDIDS_HXX
// USED SERVICES
#include <algorithm>
#include <cosv/tpl/range.hxx>
namespace ary
{
/** Implementation of a set of children to an entity in the Autodoc
repository. The children are sorted.
@tpl COMPARE
Needs to provide types:
entity_base_type
id_type
key_type
and functions:
static entity_base_type &
EntityOf_(
id_type i_id );
static const key_type &
KeyOf_(
const entity_type & i_entity );
static bool Lesser_(
const key_type & i_1,
const key_type & i_2 );
*/
template<class COMPARE>
class SortedIds
{
public:
typedef typename COMPARE::id_type element_t;
typedef typename COMPARE::key_type key_t;
typedef std::vector<element_t> data_t;
typedef typename data_t::const_iterator const_iterator;
typedef typename data_t::iterator iterator;
typedef csv::range<const_iterator> search_result_t;
// LIFECYCLE
explicit SortedIds(
std::size_t i_reserve = 0 );
~SortedIds();
// OPERATIONS
void Add(
element_t i_elem );
// INQUIRY
const_iterator Begin() const;
const_iterator End() const;
element_t Search(
const key_t & i_key ) const;
search_result_t SearchAll(
const key_t & i_key ) const;
const_iterator LowerBound(
const key_t & i_key ) const;
private:
typedef typename COMPARE::entity_base_type entity_t;
// Locals
iterator LowerBound(
const key_t & i_key );
static const key_t &
KeyOf_(
element_t i_child );
template <class ITER>
static ITER impl_LowerBound_(
ITER i_begin,
ITER i_end,
const key_t & i_key );
// DATA
data_t aData;
};
// IMPLEMENTATION
template<class COMPARE>
inline const typename SortedIds<COMPARE>::key_t &
SortedIds<COMPARE>::KeyOf_(element_t i_child)
{
return COMPARE::KeyOf_(COMPARE::EntityOf_(i_child));
}
template<class COMPARE>
SortedIds<COMPARE>::SortedIds(std::size_t i_reserve)
: aData()
{
if (i_reserve > 0)
aData.reserve(i_reserve);
}
template<class COMPARE>
SortedIds<COMPARE>::~SortedIds()
{
}
template<class COMPARE>
void
SortedIds<COMPARE>::Add(element_t i_elem)
{
aData.insert( LowerBound( KeyOf_(i_elem) ),
i_elem );
}
template<class COMPARE>
inline typename SortedIds<COMPARE>::const_iterator
SortedIds<COMPARE>::Begin() const
{
return aData.begin();
}
template<class COMPARE>
inline typename SortedIds<COMPARE>::const_iterator
SortedIds<COMPARE>::End() const
{
return aData.end();
}
template<class COMPARE>
typename SortedIds<COMPARE>::element_t
SortedIds<COMPARE>::Search(const key_t & i_key) const
{
const_iterator
ret = LowerBound(i_key);
return ret != aData.end() AND NOT COMPARE::Lesser_(i_key, KeyOf_(*ret))
? *ret
: element_t(0);
}
template<class COMPARE>
typename SortedIds<COMPARE>::search_result_t
SortedIds<COMPARE>::SearchAll(const key_t & i_key) const
{
const_iterator
r1 = LowerBound(i_key);
const_iterator
r2 = r1;
while ( r2 != aData.end()
AND NOT COMPARE::Lesser_(i_key, KeyOf_(*r2)) )
{
++r2;
}
return csv::make_range(r1,r2);
}
template<class COMPARE>
inline typename SortedIds<COMPARE>::const_iterator
SortedIds<COMPARE>::LowerBound(const key_t & i_key) const
{
return impl_LowerBound_( aData.begin(),
aData.end(),
i_key );
}
template<class COMPARE>
inline typename SortedIds<COMPARE>::iterator
SortedIds<COMPARE>::LowerBound(const key_t & i_key)
{
return impl_LowerBound_( aData.begin(),
aData.end(),
i_key );
}
template<class COMPARE>
template <class ITER>
ITER
SortedIds<COMPARE>::impl_LowerBound_( ITER i_begin,
ITER i_end,
const key_t & i_key )
{
ITER i1 = i_begin;
ITER i2 = i_end;
for ( ITER it = i1 + (i2-i1)/2;
i1 != i2;
it = i1 + (i2-i1)/2 )
{
if ( COMPARE::Lesser_(KeyOf_(*it), i_key) )
{
i1 = it;
++i1;
}
else
{
i2 = it;
}
} // end for
return i1;
}
} // namespace ary
#endif