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