79 lines
1.7 KiB
C++
Executable File
79 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-2009, Tomasz Sowa
|
|
* All rights reserved.
|
|
*
|
|
*/
|
|
|
|
#ifndef headerfilecmslutemplatespatterncacher
|
|
#define headerfilecmslutemplatespatterncacher
|
|
|
|
#include <vector>
|
|
#include <map>
|
|
|
|
#include "../core/item.h"
|
|
#include "ezc.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
|