2020-12-31 07:32:16 -08:00
|
|
|
// Copyright © 2008-2021 Pioneer Developers. See AUTHORS.txt for details
|
2012-09-15 17:59:15 -07:00
|
|
|
// Licensed under the terms of the GPL v3. See licenses/GPL-3.txt
|
2012-09-12 04:38:30 -07:00
|
|
|
|
2012-02-18 01:35:25 -08:00
|
|
|
#ifndef _BYTERANGE_H
|
|
|
|
#define _BYTERANGE_H
|
|
|
|
|
2019-01-02 08:59:07 -08:00
|
|
|
#include <algorithm>
|
2012-02-18 01:35:25 -08:00
|
|
|
#include <cassert>
|
2018-06-16 06:25:42 -07:00
|
|
|
#include <cctype>
|
|
|
|
#include <cstring>
|
2012-02-18 01:35:25 -08:00
|
|
|
|
2019-01-02 08:59:07 -08:00
|
|
|
struct ByteRange {
|
|
|
|
ByteRange() :
|
|
|
|
begin(0),
|
|
|
|
end(0) {}
|
|
|
|
ByteRange(const char *begin_, const char *end_) :
|
|
|
|
begin(begin_),
|
|
|
|
end(end_)
|
2012-02-18 01:35:25 -08:00
|
|
|
{
|
|
|
|
assert(begin_ && end_);
|
|
|
|
assert((end_ - begin_) >= 0);
|
|
|
|
}
|
2019-01-02 08:59:07 -08:00
|
|
|
ByteRange(const char *begin_, size_t size) :
|
|
|
|
begin(begin_),
|
|
|
|
end(begin_ + size)
|
2012-03-13 10:08:04 -07:00
|
|
|
{
|
|
|
|
assert(begin_);
|
|
|
|
}
|
2012-02-18 01:35:25 -08:00
|
|
|
|
|
|
|
const char *begin;
|
|
|
|
const char *end;
|
|
|
|
|
|
|
|
bool Empty() const { return (begin == end); }
|
|
|
|
size_t Size() const { return (end - begin); }
|
|
|
|
|
|
|
|
const char &operator[](size_t idx) const { return begin[idx]; }
|
|
|
|
const char &operator*() const { return *begin; }
|
|
|
|
|
|
|
|
size_t read(char *to, size_t sz, size_t count);
|
|
|
|
};
|
|
|
|
|
|
|
|
inline size_t ByteRange::read(char *to, size_t sz, size_t count)
|
|
|
|
{
|
|
|
|
size_t avail = Size() / sz;
|
|
|
|
count = std::min(count, avail);
|
|
|
|
size_t fullsize = sz * count;
|
|
|
|
assert(fullsize <= Size());
|
|
|
|
memcpy(to, begin, fullsize);
|
|
|
|
begin += fullsize;
|
|
|
|
return count;
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|