gearmulator

Emulation of classic VA synths of the late 90s/2000s that are based on Motorola 56300 family DSPs
Log | Files | Refs | Submodules | README | LICENSE

md5.h (2557B)


      1 #pragma once
      2 
      3 #include <array>
      4 #include <cassert>
      5 #include <cstdint>
      6 #include <string>
      7 #include <vector>
      8 
      9 namespace baseLib
     10 {
     11 	class MD5
     12 	{
     13 	public:
     14 		static constexpr uint32_t parse1(const char _b)
     15 		{
     16 			if (_b >= '0' && _b <= '9')
     17 				return _b - '0';
     18 			if (_b >= 'A' && _b <= 'F')
     19 				return _b - 'A' + 10;
     20 			if (_b >= 'a' && _b <= 'f')
     21 				return _b - 'a' + 10;
     22 			assert(false);
     23 			return 0;
     24 		}
     25 		static constexpr uint32_t parse2(const char _b0, const char _b1)
     26 		{
     27 			return parse1(_b1) << 4 | parse1(_b0);
     28 		}
     29 		static constexpr uint32_t parse4(const char _b0, const char _b1, const char _b2, const char _b3)
     30 		{
     31 			return parse2(_b3, _b2) << 8 | parse2(_b1, _b0);
     32 		}
     33 		static constexpr uint32_t parse8(const char _b0, const char _b1, const char _b2, const char _b3, const char _b4, const char _b5, const char _b6, const char _b7)
     34 		{
     35 			return parse4(_b4, _b5, _b6, _b7) << 16 | parse4(_b0, _b1, _b2, _b3);
     36 		}
     37 
     38 		template<size_t N, std::enable_if_t<N == 33, void*> = nullptr> constexpr MD5(char const(&_digest)[N])
     39 		: m_h
     40 		{
     41 			parse8(_digest[ 0], _digest[ 1], _digest[ 2], _digest[ 3], _digest[ 4], _digest[ 5], _digest[ 6], _digest[ 7]),
     42 			parse8(_digest[ 8], _digest[ 9], _digest[10], _digest[11], _digest[12], _digest[13], _digest[14], _digest[15]),
     43 			parse8(_digest[16], _digest[17], _digest[18], _digest[19], _digest[20], _digest[21], _digest[22], _digest[23]),
     44 			parse8(_digest[24], _digest[25], _digest[26], _digest[27], _digest[28], _digest[29], _digest[30], _digest[31])
     45 		}
     46 		{
     47 		}
     48 
     49 		explicit MD5(const std::vector<uint8_t>& _data);
     50 		explicit MD5(const uint8_t* _data, uint32_t _size);
     51 
     52 		MD5() : m_h({0,0,0,0}) {}
     53 
     54 		MD5(const MD5& _src) = default;
     55 		MD5(MD5&& _src) = default;
     56 
     57 		~MD5() = default;
     58 
     59 		MD5& operator = (const MD5&) = default;
     60 		MD5& operator = (MD5&&) = default;
     61 
     62 		std::string toString() const;
     63 
     64 		constexpr bool operator == (const MD5& _md5) const
     65 		{
     66 			return m_h[0] == _md5.m_h[0] && m_h[1] == _md5.m_h[1] && m_h[2] == _md5.m_h[2] && m_h[3] == _md5.m_h[3];
     67 		}
     68 
     69 		constexpr bool operator != (const MD5& _md5) const
     70 		{
     71 			return !(*this == _md5);
     72 		}
     73 
     74 		constexpr bool operator < (const MD5& _md5) const
     75 		{
     76 			if(m_h[0] < _md5.m_h[0])		return true;
     77 			if(m_h[0] > _md5.m_h[0])		return false;
     78 			if(m_h[1] < _md5.m_h[1])		return true;
     79 			if(m_h[1] > _md5.m_h[1])		return false;
     80 			if(m_h[2] < _md5.m_h[2])		return true;
     81 			if(m_h[2] > _md5.m_h[2])		return false;
     82 			if(m_h[3] < _md5.m_h[3])		return true;
     83 			/*if(m_h[3] > _md5.m_h[3])*/	return false;
     84 		}
     85 
     86 	private:
     87 		std::array<uint32_t, 4> m_h;
     88 	};
     89 }