/* * Copyright (C) 2011 Research In Motion Limited. All rights reserved. * Copyright (C) 2016-2019 Apple Inc. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #pragma once #include #include #include namespace WTF { enum HexConversionMode { Lowercase, Uppercase }; namespace Internal { inline const LChar* hexDigitsForMode(HexConversionMode mode) { static const LChar lowercaseHexDigits[17] = "0123456789abcdef"; static const LChar uppercaseHexDigits[17] = "0123456789ABCDEF"; return mode == Lowercase ? lowercaseHexDigits : uppercaseHexDigits; } WTF_EXPORT_PRIVATE std::pair appendHex(LChar* buffer, unsigned bufferSize, std::uintmax_t number, unsigned minimumDigits, HexConversionMode); template inline std::pair appendHex(std::array& buffer, NumberType number, unsigned minimumDigits, HexConversionMode mode) { return appendHex(&buffer.front(), buffer.size(), static_cast::type>(number), minimumDigits, mode); } } // namespace Internal struct HexNumberBuffer { WTF_MAKE_STRUCT_FAST_ALLOCATED; std::array buffer; unsigned length; const LChar* characters() const { return &*(buffer.end() - length); } }; template HexNumberBuffer hex(NumberType number, unsigned minimumDigits = 0, HexConversionMode mode = Uppercase) { // Each byte can generate up to two digits. HexNumberBuffer buffer; static_assert(sizeof(buffer.buffer) >= sizeof(NumberType) * 2, "number too large for hexNumber"); auto result = Internal::appendHex(buffer.buffer, number, minimumDigits, mode); buffer.length = result.second; return buffer; } template HexNumberBuffer hex(NumberType number, HexConversionMode mode) { return hex(number, 0, mode); } template<> class StringTypeAdapter { public: StringTypeAdapter(const HexNumberBuffer& buffer) : m_buffer { buffer } { } unsigned length() const { return m_buffer.length; } bool is8Bit() const { return true; } template void writeTo(CharacterType* destination) const { StringImpl::copyCharacters(destination, characters(), length()); } private: const LChar* characters() const { return m_buffer.characters(); } const HexNumberBuffer& m_buffer; }; class PrintStream; WTF_EXPORT_PRIVATE void printInternal(PrintStream&, HexNumberBuffer); } // namespace WTF using WTF::hex; using WTF::Lowercase;