ewmscp  ..
checksumBase.h
Go to the documentation of this file.
1 #ifndef __checksumClass_h__
2 #define __checksumClass_h__
3 #include <string>
4 #include <stdexcept>
5 #include <map>
6 
7 namespace checksum {
8  class base {
9  // now follows some reflection magic
10  public:
11  class factoryClass;
12  protected:
13  static std::map<std::string, factoryClass*>& getFactoryMap() {
14  static std::remove_reference<decltype(getFactoryMap())>::type map;
15  return map;
16  }
17  public:
18  class factoryClass {
19  protected:
20  const std::string name;
21  explicit factoryClass(const std::string& aName):
22  name(aName) {
23  getFactoryMap()[name] = this;
24  }
25  public:
26  virtual base* create() const = 0;
27  };
28  template <class T> class factoryTemplate: public factoryClass {
29  public:
30  explicit factoryTemplate(const std::string& aName): factoryClass(aName) {};
31  base* create() const override {
32  return new T(name);
33  }
34  };
35  // end of reflection magic
36  protected:
37  const std::string& name;
38  std::string result;
39  std::string expected;
40  explicit base(const std::string& aName): name(aName) {}
41  public:
42  virtual ~base() = default;
43  virtual bool parallelizable() const {
44  return false;
45  }
46  const std::string& getName() const {
47  return name;
48  };
49  const std::string& getResult() const {
50  return result;
51  };
52  void setExpectedResult(const std::string& expectedResult) {
53  expected = expectedResult;
54  }
55  const std::string& getExpectedResult() const {
56  return expected;
57  }
58  bool checkExpectation() const {
59  if (expected.empty()) { // always agree on unset expectation
60  return true;
61  }
62  return result == expected;
63  }
64  virtual void update(void *data, size_t size) = 0;
65  virtual void update(size_t size) = 0;
66  virtual void finish() = 0;
67 
68  static factoryClass* newFactory(const std::string& aName) {
69  auto it = getFactoryMap().find(aName);
70  if (it != getFactoryMap().end()) {
71  return it->second;
72  }
73  throw std::runtime_error("no checksum factory called " + aName);
74  }
75  template <class T> static void addAllowedNamesToOption(T& option) {
76  for (const auto& item : getFactoryMap()) {
77  option.fAddToRange(item.first);
78  }
79  };
80  };
81 
82  class parallel {
83  public:
84  virtual void update(void *data, size_t size, size_t offset) = 0;
85  virtual void update(size_t size, size_t offset) = 0;
86  virtual void parallelFinish() = 0;
87  };
88 
89 }; // end namespace checksum
90 #endif
checksum::base::factoryClass
Definition: checksumBase.h:18
checksum::base::getFactoryMap
static std::map< std::string, factoryClass * > & getFactoryMap()
Definition: checksumBase.h:13
checksum::base::getResult
const std::string & getResult() const
Definition: checksumBase.h:49
checksum::base::factoryClass::create
virtual base * create() const =0
checksum::base::name
const std::string & name
Definition: checksumBase.h:37
checksum::base::factoryClass::name
const std::string name
Definition: checksumBase.h:20
checksum::base::addAllowedNamesToOption
static void addAllowedNamesToOption(T &option)
Definition: checksumBase.h:75
checksum::base::checkExpectation
bool checkExpectation() const
Definition: checksumBase.h:58
checksum::base
Definition: checksumBase.h:8
checksum::base::~base
virtual ~base()=default
checksum::base::base
base(const std::string &aName)
Definition: checksumBase.h:40
checksum::base::factoryTemplate::create
base * create() const override
Definition: checksumBase.h:31
checksum::base::finish
virtual void finish()=0
checksum::parallel::parallelFinish
virtual void parallelFinish()=0
checksum::base::factoryTemplate
Definition: checksumBase.h:28
checksum::base::getName
const std::string & getName() const
Definition: checksumBase.h:46
checksum::parallel
Definition: checksumBase.h:82
checksum::base::getExpectedResult
const std::string & getExpectedResult() const
Definition: checksumBase.h:55
checksum::base::factoryClass::factoryClass
factoryClass(const std::string &aName)
Definition: checksumBase.h:21
checksum::base::expected
std::string expected
Definition: checksumBase.h:39
checksum::base::result
std::string result
Definition: checksumBase.h:38
checksum::base::newFactory
static factoryClass * newFactory(const std::string &aName)
Definition: checksumBase.h:68
checksum::base::setExpectedResult
void setExpectedResult(const std::string &expectedResult)
Definition: checksumBase.h:52
checksum::base::factoryTemplate::factoryTemplate
factoryTemplate(const std::string &aName)
Definition: checksumBase.h:30
checksum::base::update
virtual void update(void *data, size_t size)=0
checksum
Definition: adler32.cpp:9
checksum::base::parallelizable
virtual bool parallelizable() const
Definition: checksumBase.h:43
checksum::parallel::update
virtual void update(void *data, size_t size, size_t offset)=0