Mercurial > hg > orthanc-stone
diff UnitTestsSources/TestStrategy.cpp @ 708:51976977d2d3
reorganization
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Mon, 20 May 2019 11:20:01 +0200 |
parents | 14557e550920 |
children | 2d8ab34c8c91 |
line wrap: on
line diff
--- a/UnitTestsSources/TestStrategy.cpp Mon May 20 11:03:50 2019 +0200 +++ b/UnitTestsSources/TestStrategy.cpp Mon May 20 11:20:01 2019 +0200 @@ -21,275 +21,10 @@ #include "gtest/gtest.h" -#include <Core/OrthancException.h> - -#include <boost/noncopyable.hpp> -#include <vector> - -namespace OrthancStone -{ - class IFetchingStrategy : public boost::noncopyable - { - public: - virtual ~IFetchingStrategy() - { - } - - virtual unsigned int GetItemsCount() const = 0; - - virtual unsigned int GetMaxQuality() const = 0; - - virtual bool GetNext(unsigned int& item, - unsigned int& quality) = 0; - - virtual void SetCurrent(unsigned int item) = 0; - - // Ask the strategy to re-schedule the item with the lowest - // priority in the fetching order. This allows to know which item - // should be dropped from a cache. - virtual void RecycleFurthest(unsigned int& item) = 0; - }; - - - class IFetchingItemsSorter : public boost::noncopyable - { - public: - virtual ~IFetchingItemsSorter() - { - } - - virtual unsigned int GetItemsCount() const = 0; - - // Sort a set of items given the current item - virtual void Sort(std::vector<unsigned int>& target, - unsigned int current) = 0; - }; - - - - class BasicFetchingItemsSorter : public IFetchingItemsSorter - { - private: - unsigned int itemsCount_; - - public: - BasicFetchingItemsSorter(unsigned int itemsCount) : - itemsCount_(itemsCount) - { - if (itemsCount == 0) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - } - - virtual unsigned int GetItemsCount() const - { - return itemsCount_; - } - - virtual void Sort(std::vector<unsigned int>& target, - unsigned int current) - { - if (current >= itemsCount_) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - target.clear(); - target.reserve(itemsCount_); - target.push_back(current); - - const unsigned int countBelow = current; - const unsigned int countAbove = (itemsCount_ - 1) - current; - const unsigned int n = std::min(countBelow, countAbove); - - for (unsigned int i = 1; i <= n; i++) - { - assert(current + i < itemsCount_ && - current >= i); - target.push_back(current + i); - target.push_back(current - i); - } - - for (unsigned int i = current - n; i > 0; i--) - { - target.push_back(i - 1); - } - - for (unsigned int i = current + n + 1; i < itemsCount_; i++) - { - target.push_back(i); - } - - assert(target.size() == itemsCount_); - } - }; - - - class BasicFetchingStrategy : public IFetchingStrategy - { - private: - class ContentItem - { - private: - unsigned int item_; - unsigned int quality_; - - public: - ContentItem(unsigned int item, - unsigned int quality) : - item_(item), - quality_(quality) - { - } - - unsigned int GetItem() const - { - return item_; - } - - unsigned int GetQuality() const - { - return quality_; - } - }; +#include "../Framework/Loaders/BasicFetchingStrategy.h" +#include "../Framework/Loaders/BasicFetchingItemsSorter.h" - std::auto_ptr<IFetchingItemsSorter> sorter_; - std::vector<unsigned int> nextQuality_; - unsigned int maxQuality_; - std::vector<ContentItem> content_; - size_t position_; - unsigned int blockSize_; - - void Schedule(unsigned int item, - unsigned int quality) - { - assert(item < GetItemsCount() && - quality <= maxQuality_); - - if (nextQuality_[item] <= quality) - { - content_.push_back(ContentItem(item, quality)); - } - } - - public: - BasicFetchingStrategy(IFetchingItemsSorter* sorter, // Takes ownership - unsigned int maxQuality) : - sorter_(sorter), - maxQuality_(maxQuality), - position_(0), - blockSize_(2) - { - if (sorter == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); - } - - nextQuality_.resize(sorter_->GetItemsCount(), 0), // Does not change along calls to "SetCurrent()" - - SetCurrent(0); - } - - virtual unsigned int GetItemsCount() const - { - return sorter_->GetItemsCount(); - } - - virtual unsigned int GetMaxQuality() const - { - return maxQuality_; - } - - void SetBlockSize(unsigned int size) - { - if (size <= 0) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - blockSize_ = size; - } - - virtual bool GetNext(unsigned int& item, - unsigned int& quality) - { - if (position_ >= content_.size()) - { - return false; - } - else - { - item = content_[position_].GetItem(); - quality = content_[position_].GetQuality(); - - assert(nextQuality_[item] <= quality); - nextQuality_[item] = quality + 1; - - position_ ++; - return true; - } - } - - virtual void SetCurrent(unsigned int item) - { - // TODO - This function is O(N) complexity where "N" is the - // number of items times the max quality. Could use a LRU index. - - position_ = 0; - - std::vector<unsigned int> v; - sorter_->Sort(v, item); - - assert(v.size() == GetItemsCount()); - - if (v.size() == 0) - { - return; - } - - content_.clear(); - content_.reserve(v.size() * maxQuality_); - - Schedule(v.front(), maxQuality_); - - for (unsigned int q = 0; q <= maxQuality_; q++) - { - unsigned int start = 1 + q * blockSize_; - unsigned int end = start + blockSize_; - - if (q == maxQuality_ || - end > v.size()) - { - end = v.size(); - } - - unsigned int a = 0; - if (maxQuality_ >= q + 1) - { - a = maxQuality_ - q - 1; - } - - for (unsigned int j = a; j <= maxQuality_; j++) - { - for (unsigned int i = start; i < end; i++) - { - Schedule(v[i], j); - } - } - } - } - - // Ask the strategy to re-schedule the item with the lowest - // priority in the fetching order. This allows to know which item - // should be dropped from a cache. - virtual void RecycleFurthest(unsigned int& item) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - }; -} - +#include <Core/OrthancException.h> namespace