#ifndef NET_BASE_HASH_VALUE_H_
#define NET_BASE_HASH_VALUE_H_
#include <stddef.h>
#include <stdint.h>
#include <array>
#include <string>
#include <string_view>
#include <vector>
#include "base/containers/span.h"
#include "build/build_config.h"
#include "net/base/net_export.h"
namespace net {
using SHA256HashValue = std::array<uint8_t, 32>;
enum HashValueTag {
HASH_VALUE_SHA256,
};
class NET_EXPORT HashValue {
public:
using iterator = base::span<uint8_t>::iterator;
using const_iterator = base::span<const uint8_t>::iterator;
explicit HashValue(const SHA256HashValue& hash);
explicit HashValue(base::span<const uint8_t> hash);
explicit HashValue(HashValueTag tag) : tag_(tag) {}
HashValue() : tag_(HASH_VALUE_SHA256) {}
bool FromString(std::string_view input);
std::string ToString() const;
base::span<uint8_t> span();
base::span<const uint8_t> span() const;
const SHA256HashValue& sha256hashvalue() const;
HashValueTag tag() const { return tag_; }
NET_EXPORT friend bool operator==(const HashValue& lhs, const HashValue& rhs);
NET_EXPORT friend bool operator<(const HashValue& lhs, const HashValue& rhs);
NET_EXPORT friend bool operator>(const HashValue& lhs, const HashValue& rhs);
NET_EXPORT friend bool operator<=(const HashValue& lhs, const HashValue& rhs);
NET_EXPORT friend bool operator>=(const HashValue& lhs, const HashValue& rhs);
private:
HashValueTag tag_;
union {
SHA256HashValue sha256;
} fingerprint;
};
typedef std::vector<HashValue> HashValueVector;
}
#endif