winix/templates/patterncacher.h

78 lines
1.7 KiB
C++
Executable File

/*
* This file is a part of CMSLU -- Content Management System like Unix
* and is not publicly distributed
*
* Copyright (c) 2008, Tomasz Sowa
* All rights reserved.
*
*/
#ifndef headerfilepatterncacher
#define headerfilepatterncacher
#include <vector>
#include <map>
#include "../core/item.h"
#include "../../ezc/src/ezc.h"
#include "../core/log.h"
class PatternCacher
{
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);
void CheckTableSize();
// 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;
public:
PatternCacher();
// 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);
};
#endif