blob: 07ad766e5ca0269d3738051f8118ef65a99d11b9 [file] [log] [blame]
// Copyright 2018 The Fuchsia 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 LIB_FOSTR_HEX_DUMP_H_
#define LIB_FOSTR_HEX_DUMP_H_
#include <limits>
#include <vector>
#include "lib/fostr/indent.h"
namespace fostr {
// To insert a hex dump into an ostream, do this:
// os << fostr::hex_dump(data, size);
// or this:
// os << fostr::hex_dump(data, size, initial_address);
//
// |data| may be any raw pointer type, and |size| is in bytes. If
// |initial_address| isn't supplied or is max size_t, the actual address
// (|data|) is used. The address width is the smallest of 4, 8 and 16 that will
// accommodate the address values.
//
// The formatter used here follows the conventions described in indent.h. The
// formatter inserts an initial newline (because the first line of the dump is
// intended to appear on its own line), and the last line is not terminated.
// The indent manipulators are used, so the formatter will honor the current
// indentation level and 'indent by' value.
//
// 0000 54 68 69 73 20 69 73 20 61 6e 20 65 78 61 6d 70 This is an examp
// 0010 6c 65 20 6f 66 20 68 6f 77 20 61 20 68 65 78 20 le of how a hex
// 0020 64 75 6d 70 20 6c 6f 6f 6b 73 2e 00 dump looks..
//
// If |data| is null, "<null>" is inserted instead of a hex dump. Otherwise, if
// |size| is zero, "<zero bytes at [address]>" is inserted.
namespace internal {
struct HexDump {
HexDump(const uint8_t* data, size_t size, intptr_t initial_address)
: data_(data), size_(size), initial_address_(initial_address) {}
const uint8_t* data_;
size_t size_;
intptr_t initial_address_;
};
std::ostream& operator<<(std::ostream& os, const HexDump& value);
} // namespace internal
template <typename T>
internal::HexDump HexDump(const T* data, size_t size,
intptr_t initial_address = std::numeric_limits<intptr_t>::max()) {
return internal::HexDump(reinterpret_cast<const uint8_t*>(data), size, initial_address);
}
inline internal::HexDump HexDump(const std::vector<uint8_t>& vector) {
return internal::HexDump(vector.data(), vector.size(), 0);
}
} // namespace fostr
#endif // LIB_FOSTR_HEX_DUMP_H_