// Copyright 2016 The Chromium 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 CompressibleString_h #define CompressibleString_h #include "platform/PlatformExport.h" #include "wtf/text/Unicode.h" #include "wtf/text/WTFString.h" namespace blink { // TODO(hajimehoshi): Now these classes are in platform/text to use UMA. Move // them to wtf/text. class PLATFORM_EXPORT CompressibleStringImpl final : public RefCounted { WTF_MAKE_NONCOPYABLE(CompressibleStringImpl); public: static void compressAll(); CompressibleStringImpl() : m_string() , m_isCompressed(false) { } explicit CompressibleStringImpl(PassRefPtr); ~CompressibleStringImpl(); bool isEmpty() const { return originalLength() == 0; } bool isCompressed() const { return m_isCompressed; } unsigned originalLength() const { return m_string.length(); } bool is8Bit() const { return m_string.is8Bit(); } unsigned originalContentSizeInBytes() const { if (is8Bit()) return originalLength() * sizeof(LChar); return originalLength() * sizeof(UChar); } // TODO(hajimehoshi): Update this once we implement compression. unsigned currentSizeInBytes() const { return originalContentSizeInBytes(); } const String& toString() { if (UNLIKELY(isCompressed())) decompressString(); return m_string; } const LChar* characters8() { return toString().characters8(); } const UChar* characters16() { return toString().characters16(); } void compressString(); void decompressString(); private: String m_string; bool m_isCompressed; }; class PLATFORM_EXPORT CompressibleString final { public: CompressibleString() : m_impl(nullptr) { } CompressibleString(const CompressibleString& rhs) : m_impl(rhs.m_impl) { } explicit CompressibleString(PassRefPtr impl) : m_impl(impl ? adoptRef(new CompressibleStringImpl(impl)) : nullptr) { } bool isNull() const { return !m_impl; } bool isEmpty() const { return isNull() || m_impl->isEmpty(); } unsigned length() const { return m_impl ? m_impl->originalLength() : 0; } unsigned currentSizeInBytes() const { return m_impl ? m_impl->currentSizeInBytes() : 0; } bool isCompressed() const { return m_impl ? m_impl->isCompressed() : false; } bool is8Bit() const { return m_impl ? m_impl->is8Bit() : false; } const String& toString() const { return m_impl ? m_impl->toString() : emptyString(); } const LChar* characters8() const { return m_impl ? m_impl->characters8() : nullptr; } const UChar* characters16() const { return m_impl ? m_impl->characters16() : nullptr; } CompressibleStringImpl* impl() const { return m_impl.get(); } private: void compressString() const { m_impl->compressString(); } void decompressString() const { m_impl->decompressString(); } mutable RefPtr m_impl; }; } // namespace blink using blink::CompressibleString; using blink::CompressibleStringImpl; #endif