/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/



#ifndef INCLUDED_BINARYURP_SOURCE_CACHE_HXX
#define INCLUDED_BINARYURP_SOURCE_CACHE_HXX

#include "sal/config.h"

#include <cstddef>
#include <list>
#ifdef USE_UNORDERED_MAP
	#include <unordered_map>
#else
	#include <map>
#endif

#include "boost/noncopyable.hpp"
#include "osl/diagnose.h"
#include "sal/types.h"

namespace binaryurp {

namespace cache {

enum { size = 256, ignore = 0xFFFF };

}

template< typename T > class Cache : private boost::noncopyable {
public:
    typedef sal_uInt16 IdxType;

    explicit Cache(std::size_t size):
        size_(size)
    {
        OSL_ASSERT(size < cache::ignore);
    }

    IdxType add( const T& rContent, bool* pbFound) {
	OSL_ASSERT( pbFound != NULL);
	if( !size_) {
		*pbFound = false;
		return cache::ignore;
	}
	// try to insert into the map
	list_.push_front( rContent); // create a temp entry
	typedef std::pair<typename LruList::iterator, IdxType> MappedType;
	typedef std::pair<typename LruItMap::iterator,bool> MapPair;
	MapPair aMP = map_.insert( MappedType( list_.begin(), 0));
	*pbFound = !aMP.second;
	
	if( !aMP.second) { // insertion not needed => found the entry
		list_.pop_front(); // remove the temp entry
		list_.splice( list_.begin(), list_, aMP.first->first); // the found entry is moved to front
		return aMP.first->second;
	}

	// test insertion successful => it was new so we keep it
	IdxType n = static_cast<IdxType>( map_.size() - 1);
	if( n >= size_) { // cache full => replace the LRU entry
		// find the least recently used element in the map
		typename LruItMap::iterator it = map_.find( --list_.end());
		n = it->second;
		map_.erase( it); // remove it from the map
		list_.pop_back(); // remove from the list
	}
	aMP.first->second = n;
	return n;
    }

private:
    typedef std::list<T> LruList; // last recently used list
    typedef typename LruList::iterator LruListIt;
#ifdef URPCACHE_USES_UNORDERED_MAP
    struct HashT{ size_t operator()( const LruListIt& rA) const { return hash(*rA;);};
    struct EqualT{ bool operator()( const LruListIt& rA, const LruListIt& rB) const { return *rA==*rB;}};
    typedef ::std::unordered_map< LruListIt, IdxType, HashT, EqualT > LruItMap; // a map into a LruList
#else
    struct CmpT{ bool operator()( const LruListIt& rA, const LruListIt& rB) const { return (*rA<*rB);}};
    typedef ::std::map< LruListIt, IdxType, CmpT > LruItMap; // a map into a LruList
#endif

    std::size_t size_;
    LruItMap map_;
    LruList list_;
};

}

#endif

