2009-01-26 21:49:28 +01:00
|
|
|
/*
|
2010-02-28 01:08:10 +01:00
|
|
|
* This file is a part of Winix
|
2009-01-26 21:49:28 +01:00
|
|
|
* and is not publicly distributed
|
|
|
|
*
|
2011-07-15 04:09:02 +02:00
|
|
|
* Copyright (c) 2008-2011, Tomasz Sowa
|
2009-01-26 21:49:28 +01:00
|
|
|
* All rights reserved.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
2011-01-23 15:15:30 +01:00
|
|
|
#ifndef headerfile_winix_templates_patterncacher
|
|
|
|
#define headerfile_winix_templates_patterncacher
|
2009-01-26 21:49:28 +01:00
|
|
|
|
|
|
|
#include <vector>
|
|
|
|
#include <map>
|
|
|
|
|
2010-11-23 22:52:25 +01:00
|
|
|
#include "core/item.h"
|
2010-11-25 23:42:24 +01:00
|
|
|
#include "misc.h"
|
2009-11-13 21:40:11 +01:00
|
|
|
#include "ezc.h"
|
2009-04-21 22:50:55 +02:00
|
|
|
|
|
|
|
|
2009-01-26 21:49:28 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class PatternCacher
|
|
|
|
{
|
2011-07-15 04:09:02 +02:00
|
|
|
public:
|
|
|
|
|
|
|
|
PatternCacher();
|
|
|
|
|
|
|
|
// setting when we should delete patterns
|
|
|
|
// we are deleting when we have more (or equal) patterns than 'when_delete'
|
|
|
|
// and then we are deleting 'how_many_del' patterns
|
|
|
|
void SetWhenDelete(size_t when_delete, size_t how_many_del);
|
|
|
|
|
|
|
|
void SetEzcFunctions(TemplatesFunctions::EzcFun * fun);
|
|
|
|
|
|
|
|
// returning a pattern corresponding to the 'item'
|
|
|
|
Ezc::Pattern * GetPattern(const Item & item);
|
|
|
|
|
|
|
|
// updating the pattern for the item
|
|
|
|
// if there is no such a pattern the method does nothing
|
|
|
|
void UpdatePattern(const Item & item);
|
|
|
|
|
|
|
|
// deleting the pattern for the item
|
|
|
|
// if there is no such a pattern the method does nothing
|
|
|
|
void DeletePattern(const Item & item);
|
|
|
|
|
|
|
|
// deleting some rarely used patters
|
|
|
|
// call it at the end of a request (or at the beginning)
|
|
|
|
void DeleteOldPatterns();
|
|
|
|
|
|
|
|
// size of the current cache in use
|
|
|
|
size_t Size();
|
|
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
2009-01-26 21:49:28 +01:00
|
|
|
struct PatternUsed
|
|
|
|
{
|
|
|
|
Ezc::Pattern pattern;
|
|
|
|
int used; // how many times used (incremented by GetPattern and UpdatePattern)
|
|
|
|
int item_id;
|
|
|
|
};
|
|
|
|
|
|
|
|
typedef std::map<long, PatternUsed> PatternTab;
|
|
|
|
PatternTab pattern_tab;
|
|
|
|
|
|
|
|
|
|
|
|
// temporarily struct used during deleting some items from pattern_tab
|
|
|
|
struct PatternErase
|
|
|
|
{
|
|
|
|
PatternTab::iterator iter;
|
|
|
|
int used;
|
|
|
|
|
|
|
|
bool operator<(const PatternErase & p) const { return used < p.used; }
|
|
|
|
};
|
|
|
|
|
|
|
|
// temporarily buffer used during deleting some items from pattern_tab
|
|
|
|
std::vector<PatternErase> erase_tab;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void CreatePattern(const Item & item, Ezc::Pattern & pattern);
|
|
|
|
void AddIndexes(const Item & item, size_t pattern_index);
|
|
|
|
Ezc::Pattern * AddPattern(const Item & item);
|
|
|
|
|
|
|
|
|
|
|
|
// the size of pattern_tab when we are deleting some items
|
|
|
|
size_t when_delete_patterns;
|
|
|
|
|
|
|
|
// how many items to delete
|
|
|
|
size_t how_many_delete;
|
|
|
|
|
2010-11-25 23:42:24 +01:00
|
|
|
// can be null (not set directly)
|
|
|
|
TemplatesFunctions::EzcFun * ezc_fun;
|
|
|
|
|
2009-01-26 21:49:28 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|