PageCache.cs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using FastReport.Utils;
  5. namespace FastReport.Preview
  6. {
  7. internal partial class PageCache : IDisposable
  8. {
  9. private List<CacheItem> pages;
  10. private PreparedPages preparedPages;
  11. private int ItemIndex(int index)
  12. {
  13. for (int i = 0; i < pages.Count; i++)
  14. {
  15. if (pages[i].index == index)
  16. return i;
  17. }
  18. return -1;
  19. }
  20. private void RemoveAt(int index)
  21. {
  22. CacheItem item = pages[index];
  23. item.Dispose();
  24. item = null;
  25. pages.RemoveAt(index);
  26. }
  27. public ReportPage Get(int index)
  28. {
  29. int i = ItemIndex(index);
  30. if (i != -1)
  31. {
  32. // page exists. Put it on the top of list.
  33. CacheItem item = pages[i];
  34. if (i != 0)
  35. {
  36. pages.RemoveAt(i);
  37. pages.Insert(0, item);
  38. }
  39. return item.page;
  40. }
  41. // add new page on the top of list.
  42. ReportPage page = preparedPages.GetPage(index);
  43. if (preparedPages.Count > pages.Count)
  44. {
  45. pages.Insert(0, new CacheItem(index, page));
  46. // remove least used pages.
  47. while (pages.Count > GetPageLimit())
  48. {
  49. RemoveAt(pages.Count - 1);
  50. }
  51. }
  52. return page;
  53. }
  54. public void Remove(int index)
  55. {
  56. int i = ItemIndex(index);
  57. if (i != -1)
  58. RemoveAt(i);
  59. }
  60. public void Clear()
  61. {
  62. while (pages.Count > 0)
  63. {
  64. RemoveAt(0);
  65. }
  66. }
  67. public void Dispose()
  68. {
  69. Clear();
  70. }
  71. public PageCache(PreparedPages preparedPages)
  72. {
  73. this.preparedPages = preparedPages;
  74. pages = new List<CacheItem>();
  75. }
  76. private class CacheItem : IDisposable
  77. {
  78. public int index;
  79. public ReportPage page;
  80. public void Dispose()
  81. {
  82. page.Dispose();
  83. page = null;
  84. }
  85. public CacheItem(int index, ReportPage page)
  86. {
  87. this.index = index;
  88. this.page = page;
  89. }
  90. }
  91. }
  92. }