mirror of https://github.com/CGAL/cgal
Hashed map with LRU capabilities
This commit is contained in:
parent
73428ec15c
commit
e9b97cd0f9
|
|
@ -41,6 +41,7 @@ Algebraic_kernel_d/include/CGAL/Algebraic_curve_kernel_2/Curve_analysis_2.h -tex
|
||||||
Algebraic_kernel_d/include/CGAL/Algebraic_curve_kernel_2/Curve_pair_analysis_2.h -text
|
Algebraic_kernel_d/include/CGAL/Algebraic_curve_kernel_2/Curve_pair_analysis_2.h -text
|
||||||
Algebraic_kernel_d/include/CGAL/Algebraic_curve_kernel_2/Curve_pair_vertical_line_1.h -text
|
Algebraic_kernel_d/include/CGAL/Algebraic_curve_kernel_2/Curve_pair_vertical_line_1.h -text
|
||||||
Algebraic_kernel_d/include/CGAL/Algebraic_curve_kernel_2/Curve_vertical_line_1.h -text
|
Algebraic_kernel_d/include/CGAL/Algebraic_curve_kernel_2/Curve_vertical_line_1.h -text
|
||||||
|
Algebraic_kernel_d/include/CGAL/Algebraic_curve_kernel_2/LRU_hashed_map.h -text
|
||||||
Algebraic_kernel_d/include/CGAL/Algebraic_curve_kernel_2/Xy_coordinate_2.h -text
|
Algebraic_kernel_d/include/CGAL/Algebraic_curve_kernel_2/Xy_coordinate_2.h -text
|
||||||
Algebraic_kernel_d/include/CGAL/Algebraic_kernel_1.h -text
|
Algebraic_kernel_d/include/CGAL/Algebraic_kernel_1.h -text
|
||||||
Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Algebraic_real_pure.h -text
|
Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Algebraic_real_pure.h -text
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,211 @@
|
||||||
|
// TODO: Add licence
|
||||||
|
//
|
||||||
|
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||||
|
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
//
|
||||||
|
// $URL:$
|
||||||
|
// $Id: $
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Author(s) : Pavel Emeliyanenko <asm@mpi-sb.mpg.de>
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
#ifndef CGAL_ALGEBRAIC_CURVE_KERNEL_HASHED_MAP_H
|
||||||
|
#define CGAL_ALGEBRAIC_CURVE_KERNEL_HASHED_MAP_H
|
||||||
|
|
||||||
|
#include <CGAL/basic.h>
|
||||||
|
|
||||||
|
#include <boost/multi_index_container.hpp>
|
||||||
|
#include <boost/multi_index/member.hpp>
|
||||||
|
#include <boost/multi_index/hashed_index.hpp>
|
||||||
|
#include <boost/multi_index/ordered_index.hpp>
|
||||||
|
#include <boost/multi_index/sequenced_index.hpp>
|
||||||
|
|
||||||
|
using boost::multi_index::multi_index_container;
|
||||||
|
using boost::multi_index::get;
|
||||||
|
using boost::multi_index::project;
|
||||||
|
|
||||||
|
CGAL_BEGIN_NAMESPACE
|
||||||
|
|
||||||
|
namespace CGALi {
|
||||||
|
|
||||||
|
//! \brief this class defines hashed map container with LRU capabilities,
|
||||||
|
//!
|
||||||
|
//! stores pair of \c KeyType_ and \c ValueType_. Before adding to
|
||||||
|
//! the map the input is normialized using \c Canonicalizer_
|
||||||
|
//! \c Pred_ is binary predicate acting as an equivalence relation on
|
||||||
|
//! values of \c KeyType_, \c Creator_ is a mapping from \c KeyType_ to
|
||||||
|
//! \c ValueType_, \c Hash_ is function object which returns hash values
|
||||||
|
//! for the keys
|
||||||
|
template <class KeyType_, class ValueType_, class Canonicalizer_,
|
||||||
|
class Hash_ = boost::hash<KeyType_>,
|
||||||
|
class Creator_ = CGAL::Creator_1<KeyType_, ValueType_>,
|
||||||
|
class Pred_ = std::equal_to<KeyType_> >
|
||||||
|
class LRU_hashed_map
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
//!\name public typedefs
|
||||||
|
//!@{
|
||||||
|
|
||||||
|
//! this instance's first argument
|
||||||
|
typedef KeyType_ Key_type;
|
||||||
|
//! this instance's second argument
|
||||||
|
typedef ValueType_ Value_type;
|
||||||
|
//! input data canonicalizer
|
||||||
|
typedef Canonicalizer_ Canonicalizer;
|
||||||
|
//! equality predicate
|
||||||
|
typedef Pred_ Pred;
|
||||||
|
//! mapping \c KeyType_ -> \c ValueType_
|
||||||
|
typedef Creator_ Creator;
|
||||||
|
//! hash function
|
||||||
|
typedef Hash_ Hash;
|
||||||
|
//! hashed map data type
|
||||||
|
typedef std::pair<Key_type, Value_type> Data_type;
|
||||||
|
//! myself
|
||||||
|
typedef LRU_hashed_map<Key_type, Value_type, Canonicalizer, Hash,
|
||||||
|
Creator, Pred> Self;
|
||||||
|
|
||||||
|
//!@}
|
||||||
|
private:
|
||||||
|
//!\name private members
|
||||||
|
//!@{
|
||||||
|
|
||||||
|
// try boost::identity ?
|
||||||
|
typedef boost::multi_index::multi_index_container<
|
||||||
|
Data_type,
|
||||||
|
boost::multi_index::indexed_by<
|
||||||
|
boost::multi_index::sequenced<>,
|
||||||
|
boost::multi_index::hashed_unique<
|
||||||
|
BOOST_MULTI_INDEX_MEMBER(Data_type, Key_type, first),
|
||||||
|
Hash, Pred > > > Hashed_map;
|
||||||
|
|
||||||
|
//! hashed map instance
|
||||||
|
Hashed_map _m_hashed_map;
|
||||||
|
|
||||||
|
//! maximal size allowed
|
||||||
|
unsigned _m_max_size;
|
||||||
|
|
||||||
|
//!@}
|
||||||
|
public:
|
||||||
|
//!\name iterator types
|
||||||
|
//!@{
|
||||||
|
|
||||||
|
//! hashed index iterator
|
||||||
|
typedef typename
|
||||||
|
boost::multi_index::nth_index_iterator<Hashed_map,1>::type
|
||||||
|
Hashed_iterator;
|
||||||
|
|
||||||
|
//! sequenced index iterator
|
||||||
|
typedef typename
|
||||||
|
boost::multi_index::nth_index_iterator<Hashed_map,0>::type
|
||||||
|
Sequenced_iterator;
|
||||||
|
|
||||||
|
//! sequenced index const iterator
|
||||||
|
typedef typename
|
||||||
|
boost::multi_index::nth_index_const_iterator<Hashed_map,0>::type
|
||||||
|
Sequenced_const_iterator;
|
||||||
|
//!@}
|
||||||
|
public:
|
||||||
|
//!\name constructors and access functions
|
||||||
|
//!@{
|
||||||
|
|
||||||
|
//! \brief default constructor
|
||||||
|
LRU_hashed_map(unsigned max_size = -1u) : _m_hashed_map(),
|
||||||
|
_m_max_size(max_size)
|
||||||
|
{ std::cout << "constructor LRU\n"; }
|
||||||
|
|
||||||
|
~LRU_hashed_map()
|
||||||
|
{
|
||||||
|
std::cout << "destructor LRU\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! \brief implements cache-like behaviour of the map
|
||||||
|
*
|
||||||
|
* If the object is not in the map, it is constructed using \c Creator
|
||||||
|
* and added to the map
|
||||||
|
*/
|
||||||
|
Value_type operator()(const Key_type& key_)
|
||||||
|
{
|
||||||
|
Canonicalizer canonicalize;
|
||||||
|
Key_type key = canonicalize(key_);
|
||||||
|
std::pair<Hashed_iterator, bool> p = find(key);
|
||||||
|
|
||||||
|
if(!p.second) {
|
||||||
|
std::cout << "not found\n";
|
||||||
|
Creator create;
|
||||||
|
Value_type val = create(key);
|
||||||
|
std::cout << "result: " <<
|
||||||
|
insert(Data_type(key, val)).second << "\n";
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
return (p.first)->second;
|
||||||
|
}
|
||||||
|
|
||||||
|
//! \brief looks for an entry with a specified key in the map
|
||||||
|
//!
|
||||||
|
//! returns a pair of iterator pointing to \c Data_type and a boolean
|
||||||
|
//! indicating whether an element with specified key was found
|
||||||
|
std::pair<Hashed_iterator, bool> find(const Key_type& key)
|
||||||
|
{
|
||||||
|
typename boost::multi_index::nth_index<Hashed_map,1>::type&
|
||||||
|
idx = _m_hashed_map.get<1>();
|
||||||
|
Hashed_iterator it = idx.find(key);
|
||||||
|
if(it == idx.end())
|
||||||
|
return std::make_pair<Hashed_iterator, bool>(it, false);
|
||||||
|
// otherwise put the accessed element on the top
|
||||||
|
_m_hashed_map.relocate(_m_hashed_map.begin(),
|
||||||
|
_m_hashed_map.project<0>(it));
|
||||||
|
return std::make_pair<Hashed_iterator, bool>(it, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
//! \brief inserts an entry to the map
|
||||||
|
//!
|
||||||
|
//! on successful insertion, \c p.first points to the element
|
||||||
|
//! inserted; otherwise \c p.first points to an element that caused
|
||||||
|
//! the insertion to be banned. If the map's size exceeds \c max_size
|
||||||
|
//! the least recently used entry is dropped
|
||||||
|
std::pair<Sequenced_iterator, bool> insert(const Data_type& data)
|
||||||
|
{
|
||||||
|
if(_m_hashed_map.size() > _m_max_size)
|
||||||
|
_m_hashed_map.pop_back();
|
||||||
|
return _m_hashed_map.push_front(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
//! clears the map contents
|
||||||
|
void clear() { _m_hashed_map.clear(); }
|
||||||
|
|
||||||
|
//! returns whether the map is empty.
|
||||||
|
bool is_empty() const { return _m_hashed_map.empty(); }
|
||||||
|
|
||||||
|
//! returns the number of items in the map
|
||||||
|
unsigned size() { return _m_hashed_map.size(); }
|
||||||
|
|
||||||
|
//! returns the largest possible size of the map (-1 if not set)
|
||||||
|
unsigned max_size() const { return _m_max_size; }
|
||||||
|
|
||||||
|
//! \brief returns an iterator pointing to the beginning of the map
|
||||||
|
//!
|
||||||
|
//! all iterators run over sequenced indices
|
||||||
|
Sequenced_iterator begin() { return _m_hashed_map.begin(); }
|
||||||
|
|
||||||
|
//! returns an iterator pointing to the end of the map
|
||||||
|
Sequenced_iterator end() { return _m_hashed_map.end(); }
|
||||||
|
|
||||||
|
//! returns a const_iterator pointing to the beginning of the map
|
||||||
|
Sequenced_const_iterator begin() const
|
||||||
|
{ return _m_hashed_map.begin(); }
|
||||||
|
|
||||||
|
//! Returns a const_iterator pointing to the end of the map
|
||||||
|
Sequenced_const_iterator end() const
|
||||||
|
{ return _m_hashed_map.end(); }
|
||||||
|
|
||||||
|
//!@}
|
||||||
|
}; // class LRU_hashed_map
|
||||||
|
|
||||||
|
} // namespace CGALi
|
||||||
|
|
||||||
|
CGAL_END_NAMESPACE
|
||||||
|
|
||||||
|
#endif // CGAL_ALGEBRAIC_CURVE_KERNEL_HASHED_MAP_H
|
||||||
Loading…
Reference in New Issue