From 111044b60ba5f40e003d1ba1d4082794985aa3ad Mon Sep 17 00:00:00 2001 From: Michael Krelin Date: Tue, 30 Aug 2011 20:04:30 +0000 Subject: introduce incremental md5 digester Signed-off-by: Michael Krelin --- (limited to 'src/eyetil.h') diff --git a/src/eyetil.h b/src/eyetil.h index d946e71..eff2c43 100644 --- a/src/eyetil.h +++ b/src/eyetil.h @@ -5,6 +5,7 @@ #include #include #include +#include "openssl/md5.h" class binary_t : public std::vector { public: @@ -21,6 +22,42 @@ class binary_t : public std::vector { binary_t md5() const; }; +struct md5_digester { + MD5_CTX ctx; + md5_digester() { init(); } + + void init(); + void update(const void *d,size_t l); + binary_t final(); + + template + void update(const T& x) { update(&x,sizeof(x)); } + + template + struct update_iterator : public std::iterator { + md5_digester *d; + update_iterator(md5_digester *d_) : d(d_) { } + update_iterator(const update_iterator& x) : d(x.d) { } + + update_iterator& operator*() { return *this; } + update_iterator& operator++() { return *this; } + update_iterator& operator++(int) { return *this; } + + update_iterator& operator=(const T& x) { + d->update(x); return *this; + } + }; + + template + update_iterator updater() { + return update_iterator(this); + } + +}; +template<> inline void md5_digester::update(const binary_t& x) { + update((const unsigned char*)&(x.front()),x.size()); +} + class tmpdir_t { public: std::string dir; -- cgit v0.9.0.2