winix/templates/patterncacher.h

100 lines
2.2 KiB
C++
Executable File

/*
* This file is a part of Winix
* and is not publicly distributed
*
* Copyright (c) 2008-2011, Tomasz Sowa
* All rights reserved.
*
*/
#ifndef headerfile_winix_templates_patterncacher
#define headerfile_winix_templates_patterncacher
#include <vector>
#include <map>
#include "core/item.h"
#include "misc.h"
#include "ezc.h"
class PatternCacher
{
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:
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;
// can be null (not set directly)
TemplatesFunctions::EzcFun * ezc_fun;
};
#endif