1 /* 2 SPDX-FileCopyrightText: 2008 Akarsh Simha <akarshsimha@gmail.com> 3 4 SPDX-License-Identifier: GPL-2.0-or-later 5 */ 6 7 #pragma once 8 9 #include "typedef.h" 10 11 class StarBlock; 12 13 /** 14 * @class StarBlockFactory 15 * 16 * @short A factory that creates StarBlocks and recycles them in an LRU Cache 17 * @author Akarsh Simha 18 * @version 0.1 19 */ 20 21 class StarBlockFactory 22 { 23 public: 24 static StarBlockFactory *Instance(); 25 26 /** 27 * Destructor 28 * Deletes the linked list that maintains the Cache, sets the pointer to nullptr 29 */ 30 ~StarBlockFactory(); 31 32 /** 33 * @short Return a StarBlock available for use 34 * 35 * This method first checks if there are any cached StarBlocks that are not in use. 36 * If such a StarBlock is found, it returns the same for use. Else it freshly allocates 37 * a StarBlock and returns the same. It also moves the StarBlock to the front, marking it 38 * as the most recently used. If the StarBlock had a parent StarBlockList, this method 39 * detaches the StarBlock from the StarBlockList 40 * 41 * @return A StarBlock that is available for use 42 */ 43 std::shared_ptr<StarBlock> getBlock(); 44 45 /** 46 * @short Mark a StarBlock as most recently used and sync its drawID with the current drawID 47 * 48 * @return true on success, false if the StarBlock supplied was not on our list at all 49 */ 50 bool markFirst(std::shared_ptr<StarBlock>& block); 51 52 /** 53 * @short Rank a given StarBlock after another given StarBlock in the LRU list 54 * and sync its drawID with the current drawID 55 * 56 * @param after The block after which 'block' should be put 57 * @param block The block to mark for use 58 * @return true on success, false on failure 59 */ 60 bool markNext(std::shared_ptr<StarBlock>& after, std::shared_ptr<StarBlock>& block); 61 62 /** 63 * @short Returns the number of StarBlocks currently produced 64 * 65 * @return Number of StarBlocks currently allocated 66 */ getBlockCount()67 inline int getBlockCount() const { return nBlocks; } 68 69 /** 70 * @short Frees all StarBlocks that are in the cache 71 * @return The number of StarBlocks freed 72 */ freeAll()73 inline int freeAll() { return deleteBlocks(nBlocks); } 74 75 /** 76 * @short Frees all StarBlocks that are not used in this draw cycle 77 * @return The number of StarBlocks freed 78 */ 79 int freeUnused(); 80 81 /** 82 * @short Prints the structure of the cache, for debugging 83 */ 84 void printStructure() const; 85 86 quint32 drawID; // A number identifying the current draw cycle 87 88 private: 89 /** 90 * Constructor 91 * Initializes first and last StarBlock pointers to nullptr 92 */ 93 StarBlockFactory(); 94 95 /** 96 * @short Deletes the N least recently used blocks 97 * 98 * @param nblocks Number of blocks to delete 99 * @return Number of blocks successfully deleted 100 */ 101 int deleteBlocks(int nblocks); 102 103 std::shared_ptr<StarBlock> first, last; // Pointers to the beginning and end of the linked list 104 int nBlocks; // Number of blocks we currently have in the cache 105 int nCache; // Number of blocks to start recycling cached blocks at 106 107 static StarBlockFactory *pInstance; 108 }; 109