diff options
Diffstat (limited to 'fuzz/span.h')
-rw-r--r-- | fuzz/span.h | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/fuzz/span.h b/fuzz/span.h new file mode 100644 index 0000000000..531df832a3 --- /dev/null +++ b/fuzz/span.h @@ -0,0 +1,56 @@ +// Copyright 2018 The Chromium OS Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef __FUZZ_SPAN_H +#define __FUZZ_SPAN_H + +#include <unistd.h> + +#include <algorithm> + +namespace fuzz { + +template <typename T> +class span { + public: + typedef T value_type; + + constexpr span() : span<T>(nullptr, nullptr) {} + constexpr span(T* begin, size_t size) : begin_(begin), end_(begin + size) {} + constexpr span(T* begin, T* end) : begin_(begin), end_(end) {} + + template <class Container> + constexpr span(Container& container) + : begin_(container.begin()), end_(container.end()){}; + + constexpr T* begin() const { return begin_; } + constexpr T* end() const { return end_; } + + constexpr T* data() const { return begin_; } + + constexpr bool empty() const { return begin_ == end_; } + constexpr size_t size() const { return end_ - begin_; } + + private: + T* begin_; + T* end_; +}; + +template <typename Source, typename Destination> +size_t CopyWithPadding(Source source, + Destination destination, + typename Destination::value_type fill_value) { + if (source.size() >= destination.size()) { + std::copy(source.begin(), source.begin() + destination.size(), + destination.begin()); + return destination.size(); + } + std::copy(source.begin(), source.end(), destination.begin()); + std::fill(destination.begin() + source.size(), destination.end(), fill_value); + return source.size(); +} + +} // namespace fuzz + +#endif // __FUZZ_SPAN_H |