/* * 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 #include #include "../core/item.h" #include "../../ezc/src/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 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 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