/* * 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 #include #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 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); // 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