// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#ifndef CORE_INCLUDE_FXCRT_FX_STRING_H_
#define CORE_INCLUDE_FXCRT_FX_STRING_H_

#include <stdint.h>  // For intptr_t.
#include <algorithm>

#include "fx_memory.h"
#include "fx_system.h"

class CFX_BinaryBuf;
class CFX_ByteString;
class CFX_WideString;
struct CFX_CharMap;

// An immutable string with caller-provided storage which must outlive the
// string itself.
class CFX_ByteStringC
{
public:
    typedef FX_CHAR value_type;

    CFX_ByteStringC()
    {
        m_Ptr = NULL;
        m_Length = 0;
    }

    CFX_ByteStringC(const uint8_t* ptr, FX_STRSIZE size)
    {
        m_Ptr = ptr;
        m_Length = size;
    }

    CFX_ByteStringC(const FX_CHAR* ptr)
    {
        m_Ptr = (const uint8_t*)ptr;
        m_Length = ptr ? FXSYS_strlen(ptr) : 0;
    }

    // |ch| must be an lvalue that outlives the the CFX_ByteStringC. However,
    // the use of char rvalues are not caught at compile time.  They are
    // implicitly promoted to CFX_ByteString (see below) and then the
    // CFX_ByteStringC is constructed from the CFX_ByteString via the alternate
    // constructor below. The CFX_ByteString then typically goes out of scope
    // and |m_Ptr| may be left pointing to invalid memory. Beware.
    // TODO(tsepez): Mark single-argument string constructors as explicit.
    CFX_ByteStringC(FX_CHAR& ch)
    {
        m_Ptr = (const uint8_t*)&ch;
        m_Length = 1;
    }

    CFX_ByteStringC(const FX_CHAR* ptr, FX_STRSIZE len)
    {
        m_Ptr = (const uint8_t*)ptr;
        m_Length = (len == -1) ? FXSYS_strlen(ptr) : len;
    }

    CFX_ByteStringC(const CFX_ByteStringC& src)
    {
        m_Ptr = src.m_Ptr;
        m_Length = src.m_Length;
    }

    CFX_ByteStringC(const CFX_ByteString& src);

    CFX_ByteStringC& operator = (const FX_CHAR* src)
    {
        m_Ptr = (const uint8_t*)src;
        m_Length = m_Ptr ? FXSYS_strlen(src) : 0;
        return *this;
    }

    CFX_ByteStringC& operator = (const CFX_ByteStringC& src)
    {
        m_Ptr = src.m_Ptr;
        m_Length = src.m_Length;
        return *this;
    }

    CFX_ByteStringC& operator = (const CFX_ByteString& src);

    bool operator== (const char* ptr) const {
        return FXSYS_strlen(ptr) == m_Length &&
                FXSYS_memcmp32(ptr, m_Ptr, m_Length) == 0;
    }
    bool operator== (const CFX_ByteStringC& other) const {
        return other.m_Length == m_Length &&
                FXSYS_memcmp32(other.m_Ptr, m_Ptr, m_Length) == 0;
    }
    bool operator!= (const char* ptr) const { return !(*this == ptr); }
    bool operator!= (const CFX_ByteStringC& other) const {
        return !(*this == other);
    }

    FX_DWORD		GetID(FX_STRSIZE start_pos = 0) const;

    const uint8_t*		GetPtr() const
    {
        return m_Ptr;
    }

    const FX_CHAR*		GetCStr() const
    {
        return (const FX_CHAR*)m_Ptr;
    }

    FX_STRSIZE		GetLength() const
    {
        return m_Length;
    }

    bool			IsEmpty() const
    {
        return m_Length == 0;
    }

    uint8_t			GetAt(FX_STRSIZE index) const
    {
        return m_Ptr[index];
    }

    CFX_ByteStringC	Mid(FX_STRSIZE index, FX_STRSIZE count = -1) const
    {
        if (index < 0) {
            index = 0;
        }
        if (index > m_Length) {
            return CFX_ByteStringC();
        }
        if (count < 0 || count > m_Length - index) {
            count = m_Length - index;
        }
        return CFX_ByteStringC(m_Ptr + index, count);
    }

    const uint8_t& operator[] (size_t index) const
    {
        return m_Ptr[index];
    }

    bool operator< (const CFX_ByteStringC& that) const
    {
        int result = memcmp(m_Ptr, that.m_Ptr, std::min(m_Length, that.m_Length));
        return result < 0 || (result == 0 && m_Length < that.m_Length);
    }

protected:
    const uint8_t*		m_Ptr;
    FX_STRSIZE		m_Length;

private:
    void*			operator new (size_t) throw()
    {
        return NULL;
    }
};
inline bool operator== (const char* lhs, const CFX_ByteStringC& rhs) {
    return rhs == lhs;
}
inline bool operator!= (const char* lhs, const CFX_ByteStringC& rhs) {
    return rhs != lhs;
}
#define FX_BSTRC(str) CFX_ByteStringC(str, sizeof str-1)
#define FXBSTR_ID(c1, c2, c3, c4) ((c1 << 24) | (c2 << 16) | (c3 << 8) | (c4))

// A mutable string with shared buffers using copy-on-write semantics that
// avoids the cost of std::string's iterator stability guarantees.
class CFX_ByteString
{
public:
    typedef FX_CHAR value_type;

    CFX_ByteString() : m_pData(nullptr) { }

    // Copy constructor.
    CFX_ByteString(const CFX_ByteString& str);

    // Move constructor.
    inline CFX_ByteString(CFX_ByteString&& other) {
        this->m_pData = other.m_pData;
        other.m_pData = nullptr;
    }

    CFX_ByteString(char ch);
    CFX_ByteString(const FX_CHAR* ptr)
            : CFX_ByteString(ptr, ptr ? FXSYS_strlen(ptr) : 0) { }

    CFX_ByteString(const FX_CHAR* ptr, FX_STRSIZE len);
    CFX_ByteString(const uint8_t* ptr, FX_STRSIZE len);

    CFX_ByteString(const CFX_ByteStringC& bstrc);
    CFX_ByteString(const CFX_ByteStringC& bstrc1, const CFX_ByteStringC& bstrc2);

    ~CFX_ByteString();

    static CFX_ByteString	FromUnicode(const FX_WCHAR* ptr, FX_STRSIZE len = -1);

    static CFX_ByteString	FromUnicode(const CFX_WideString& str);

    // Explicit conversion to raw string
    const FX_CHAR* c_str() const
    {
        return m_pData ? m_pData->m_String : "";
    }

    // Implicit conversion to C-style string -- deprecated
    operator				const FX_CHAR*() const
    {
        return m_pData ? m_pData->m_String : "";
    }

    operator				const uint8_t*() const
    {
        return m_pData ? (const uint8_t*)m_pData->m_String : NULL;
    }

    FX_STRSIZE				GetLength() const
    {
        return m_pData ? m_pData->m_nDataLength : 0;
    }

    bool					IsEmpty() const
    {
        return !GetLength();
    }

    int						Compare(const CFX_ByteStringC& str) const;


    bool Equal(const char* ptr) const;
    bool Equal(const CFX_ByteStringC& str) const;
    bool Equal(const CFX_ByteString& other) const;

    bool EqualNoCase(const CFX_ByteStringC& str) const;

    bool operator== (const char* ptr) const { return Equal(ptr); }
    bool operator== (const CFX_ByteStringC& str) const { return Equal(str); }
    bool operator== (const CFX_ByteString& other) const { return Equal(other); }

    bool operator!= (const char* ptr) const { return !(*this == ptr); }
    bool operator!= (const CFX_ByteStringC& str) const {
        return !(*this == str);
    }
    bool operator!= (const CFX_ByteString& other) const {
        return !(*this == other);
    }

    bool operator< (const CFX_ByteString& str) const
    {
        int result = FXSYS_memcmp32(c_str(), str.c_str(), std::min(GetLength(), str.GetLength()));
        return result < 0 || (result == 0 && GetLength() < str.GetLength());
    }

    void					Empty();

    const CFX_ByteString&	operator = (const FX_CHAR* str);

    const CFX_ByteString&	operator = (const CFX_ByteStringC& bstrc);

    const CFX_ByteString&	operator = (const CFX_ByteString& stringSrc);

    const CFX_ByteString&	operator = (const CFX_BinaryBuf& buf);

    void					Load(const uint8_t* str, FX_STRSIZE len);

    const CFX_ByteString&	operator += (FX_CHAR ch);

    const CFX_ByteString&	operator += (const FX_CHAR* str);

    const CFX_ByteString&	operator += (const CFX_ByteString& str);

    const CFX_ByteString&	operator += (const CFX_ByteStringC& bstrc);

    uint8_t					GetAt(FX_STRSIZE nIndex) const
    {
        return m_pData ? m_pData->m_String[nIndex] : 0;
    }

    uint8_t					operator[](FX_STRSIZE nIndex) const
    {
        return m_pData ? m_pData->m_String[nIndex] : 0;
    }

    void					SetAt(FX_STRSIZE nIndex, FX_CHAR ch);

    FX_STRSIZE				Insert(FX_STRSIZE index, FX_CHAR ch);

    FX_STRSIZE				Delete(FX_STRSIZE index, FX_STRSIZE count = 1);


    void					Format(const FX_CHAR* lpszFormat, ... );

    void					FormatV(const FX_CHAR* lpszFormat, va_list argList);


    void					Reserve(FX_STRSIZE len);

    FX_CHAR*				GetBuffer(FX_STRSIZE len);

    void					ReleaseBuffer(FX_STRSIZE len = -1);

    CFX_ByteString			Mid(FX_STRSIZE first) const;

    CFX_ByteString			Mid(FX_STRSIZE first, FX_STRSIZE count) const;

    CFX_ByteString			Left(FX_STRSIZE count) const;

    CFX_ByteString			Right(FX_STRSIZE count) const;

    FX_STRSIZE				Find(const CFX_ByteStringC& lpszSub, FX_STRSIZE start = 0) const;

    FX_STRSIZE				Find(FX_CHAR ch, FX_STRSIZE start = 0) const;

    FX_STRSIZE				ReverseFind(FX_CHAR ch) const;

    void					MakeLower();

    void					MakeUpper();

    void					TrimRight();

    void					TrimRight(FX_CHAR chTarget);

    void					TrimRight(const CFX_ByteStringC& lpszTargets);

    void					TrimLeft();

    void					TrimLeft(FX_CHAR chTarget);

    void					TrimLeft(const CFX_ByteStringC& lpszTargets);

    FX_STRSIZE				Replace(const CFX_ByteStringC& lpszOld, const CFX_ByteStringC& lpszNew);

    FX_STRSIZE				Remove(FX_CHAR ch);

    CFX_WideString			UTF8Decode() const;

    void					ConvertFrom(const CFX_WideString& str, CFX_CharMap* pCharMap = NULL);

    FX_DWORD				GetID(FX_STRSIZE start_pos = 0) const;

#define FXFORMAT_SIGNED			1
#define FXFORMAT_HEX			2
#define FXFORMAT_CAPITAL		4

    static CFX_ByteString	FormatInteger(int i, FX_DWORD flags = 0);
    static CFX_ByteString	FormatFloat(FX_FLOAT f, int precision = 0);

protected:
    // To ensure ref counts do not overflow, consider the worst possible case:
    // the entire address space contains nothing but pointers to this object.
    // Since the count increments with each new pointer, the largest value is
    // the number of pointers that can fit into the address space. The size of
    // the address space itself is a good upper bound on it; we need not go
    // larger.
    class StringData {
      public:
        static StringData* Create(int nLen);
        void Retain() { ++m_nRefs; }
        void Release() { if (--m_nRefs <= 0) FX_Free(this); }

        intptr_t    m_nRefs;  // Would prefer ssize_t, but no windows support.
        FX_STRSIZE  m_nDataLength;
        FX_STRSIZE  m_nAllocLength;
        FX_CHAR     m_String[1];

      private:
        StringData(FX_STRSIZE dataLen, FX_STRSIZE allocLen)
                : m_nRefs(1), m_nDataLength(dataLen), m_nAllocLength(allocLen) {
            FXSYS_assert(dataLen >= 0);
            FXSYS_assert(allocLen >= 0);
            FXSYS_assert(dataLen <= allocLen);
            m_String[dataLen] = 0;
        }
        ~StringData() = delete;
    };

    void					AllocCopy(CFX_ByteString& dest, FX_STRSIZE nCopyLen, FX_STRSIZE nCopyIndex) const;
    void					AssignCopy(FX_STRSIZE nSrcLen, const FX_CHAR* lpszSrcData);
    void					ConcatCopy(FX_STRSIZE nSrc1Len, const FX_CHAR* lpszSrc1Data, FX_STRSIZE nSrc2Len, const FX_CHAR* lpszSrc2Data);
    void					ConcatInPlace(FX_STRSIZE nSrcLen, const FX_CHAR* lpszSrcData);
    void					CopyBeforeWrite();
    void					AllocBeforeWrite(FX_STRSIZE nLen);

    StringData* m_pData;
    friend class fxcrt_ByteStringConcatInPlace_Test;
};
inline CFX_ByteStringC::CFX_ByteStringC(const CFX_ByteString& src)
{
    m_Ptr = (const uint8_t*)src;
    m_Length = src.GetLength();
}
inline CFX_ByteStringC& CFX_ByteStringC::operator = (const CFX_ByteString& src)
{
    m_Ptr = (const uint8_t*)src;
    m_Length = src.GetLength();
    return *this;
}

inline bool operator== (const char* lhs, const CFX_ByteString& rhs) {
    return rhs == lhs;
}
inline bool operator== (const CFX_ByteStringC& lhs, const CFX_ByteString& rhs) {
    return rhs == lhs;
}
inline bool operator!= (const char* lhs, const CFX_ByteString& rhs) {
    return rhs != lhs;
}
inline bool operator!= (const CFX_ByteStringC& lhs, const CFX_ByteString& rhs) {
    return rhs != lhs;
}

inline CFX_ByteString operator + (const CFX_ByteStringC& str1, const CFX_ByteStringC& str2)
{
    return CFX_ByteString(str1, str2);
}
inline CFX_ByteString operator + (const CFX_ByteStringC& str1, const FX_CHAR* str2)
{
    return CFX_ByteString(str1, str2);
}
inline CFX_ByteString operator + (const FX_CHAR* str1, const CFX_ByteStringC& str2)
{
    return CFX_ByteString(str1, str2);
}
inline CFX_ByteString operator + (const CFX_ByteStringC& str1, FX_CHAR ch)
{
    return CFX_ByteString(str1, CFX_ByteStringC(ch));
}
inline CFX_ByteString operator + (FX_CHAR ch, const CFX_ByteStringC& str2)
{
    return CFX_ByteString(ch, str2);
}
inline CFX_ByteString operator + (const CFX_ByteString& str1, const CFX_ByteString& str2)
{
    return CFX_ByteString(str1, str2);
}
inline CFX_ByteString operator + (const CFX_ByteString& str1, FX_CHAR ch)
{
    return CFX_ByteString(str1, CFX_ByteStringC(ch));
}
inline CFX_ByteString operator + (FX_CHAR ch, const CFX_ByteString& str2)
{
    return CFX_ByteString(ch, str2);
}
inline CFX_ByteString operator + (const CFX_ByteString& str1, const FX_CHAR* str2)
{
    return CFX_ByteString(str1, str2);
}
inline CFX_ByteString operator + (const FX_CHAR* str1, const CFX_ByteString& str2)
{
    return CFX_ByteString(str1, str2);
}
inline CFX_ByteString operator + (const CFX_ByteString& str1, const CFX_ByteStringC& str2)
{
    return CFX_ByteString(str1, str2);
}
inline CFX_ByteString operator + (const CFX_ByteStringC& str1, const CFX_ByteString& str2)
{
    return CFX_ByteString(str1, str2);
}
class CFX_WideStringC
{
public:
    typedef FX_WCHAR value_type;

    CFX_WideStringC()
    {
        m_Ptr = NULL;
        m_Length = 0;
    }

    CFX_WideStringC(const FX_WCHAR* ptr)
    {
        m_Ptr = ptr;
        m_Length = ptr ? FXSYS_wcslen(ptr) : 0;
    }

    CFX_WideStringC(FX_WCHAR& ch)
    {
        m_Ptr = &ch;
        m_Length = 1;
    }

    CFX_WideStringC(const FX_WCHAR* ptr, FX_STRSIZE len)
    {
        m_Ptr = ptr;
        m_Length = (len == -1) ? FXSYS_wcslen(ptr) : len;
    }

    CFX_WideStringC(const CFX_WideStringC& src)
    {
        m_Ptr = src.m_Ptr;
        m_Length = src.m_Length;
    }

    CFX_WideStringC(const CFX_WideString& src);

    CFX_WideStringC& operator = (const FX_WCHAR* src)
    {
        m_Ptr = src;
        m_Length = FXSYS_wcslen(src);
        return *this;
    }

    CFX_WideStringC& operator = (const CFX_WideStringC& src)
    {
        m_Ptr = src.m_Ptr;
        m_Length = src.m_Length;
        return *this;
    }

    CFX_WideStringC& operator = (const CFX_WideString& src);

    bool operator== (const wchar_t* ptr) const  {
        return FXSYS_wcslen(ptr) == m_Length &&
            wmemcmp(ptr, m_Ptr, m_Length) == 0;
    }
    bool operator== (const CFX_WideStringC& str) const  {
        return str.m_Length == m_Length &&
            wmemcmp(str.m_Ptr, m_Ptr, m_Length) == 0;
    }
    bool operator!= (const wchar_t* ptr) const { return !(*this == ptr); }
    bool operator!= (const CFX_WideStringC& str) const {
        return !(*this == str);
    }

    const FX_WCHAR*		GetPtr() const
    {
        return m_Ptr;
    }

    FX_STRSIZE		GetLength() const
    {
        return m_Length;
    }

    bool			IsEmpty() const
    {
        return m_Length == 0;
    }

    FX_WCHAR		GetAt(FX_STRSIZE index) const
    {
        return m_Ptr[index];
    }

    CFX_WideStringC	Left(FX_STRSIZE count) const
    {
        if (count < 1) {
            return CFX_WideStringC();
        }
        if (count > m_Length) {
            count = m_Length;
        }
        return CFX_WideStringC(m_Ptr, count);
    }

    CFX_WideStringC	Mid(FX_STRSIZE index, FX_STRSIZE count = -1) const
    {
        if (index < 0) {
            index = 0;
        }
        if (index > m_Length) {
            return CFX_WideStringC();
        }
        if (count < 0 || count > m_Length - index) {
            count = m_Length - index;
        }
        return CFX_WideStringC(m_Ptr + index, count);
    }

    CFX_WideStringC	Right(FX_STRSIZE count) const
    {
        if (count < 1) {
            return CFX_WideStringC();
        }
        if (count > m_Length) {
            count = m_Length;
        }
        return CFX_WideStringC(m_Ptr + m_Length - count, count);
    }

    const FX_WCHAR& operator[] (size_t index) const
    {
        return m_Ptr[index];
    }

    bool operator< (const CFX_WideStringC& that) const
    {
        int result = wmemcmp(m_Ptr, that.m_Ptr, std::min(m_Length, that.m_Length));
        return result < 0 || (result == 0 && m_Length < that.m_Length);
     }

protected:
    const FX_WCHAR*		m_Ptr;
    FX_STRSIZE		m_Length;

private:
    void*			operator new (size_t) throw()
    {
        return NULL;
    }
};
inline bool operator== (const wchar_t* lhs, const CFX_WideStringC& rhs) {
    return rhs == lhs;
}
inline bool operator!= (const wchar_t* lhs, const CFX_WideStringC& rhs) {
    return rhs != lhs;
}
#define FX_WSTRC(wstr) CFX_WideStringC(wstr, FX_ArraySize(wstr) - 1)

// A mutable string with shared buffers using copy-on-write semantics that
// avoids the cost of std::string's iterator stability guarantees.
class CFX_WideString
{
public:
    typedef FX_WCHAR value_type;

    CFX_WideString() : m_pData(nullptr) { }

    // Copy constructor.
    CFX_WideString(const CFX_WideString& str);

    // Move constructor.
    inline CFX_WideString(CFX_WideString&& other) {
        this->m_pData = other.m_pData;
        other.m_pData = nullptr;
    }

    CFX_WideString(const FX_WCHAR* ptr)
            : CFX_WideString(ptr, ptr ? FXSYS_wcslen(ptr) : 0) { }

    CFX_WideString(const FX_WCHAR* ptr, FX_STRSIZE len);

    CFX_WideString(FX_WCHAR ch);

    CFX_WideString(const CFX_WideStringC& str);

    CFX_WideString(const CFX_WideStringC& str1, const CFX_WideStringC& str2);

    ~CFX_WideString();

    static CFX_WideString	FromLocal(const char* str, FX_STRSIZE len = -1);

    static CFX_WideString	FromUTF8(const char* str, FX_STRSIZE len);

    static CFX_WideString	FromUTF16LE(const unsigned short* str, FX_STRSIZE len);

    static FX_STRSIZE       WStringLength(const unsigned short* str);

    // Explicit conversion to raw string
    const FX_WCHAR* c_str() const
    {
        return m_pData ? m_pData->m_String : L"";
    }

    // Implicit conversion to C-style wide string -- deprecated
    operator const FX_WCHAR*() const
    {
        return m_pData ? m_pData->m_String : L"";
    }

    void					Empty();


    FX_BOOL					IsEmpty() const
    {
        return !GetLength();
    }

    FX_STRSIZE				GetLength() const
    {
        return m_pData ? m_pData->m_nDataLength : 0;
    }

    const CFX_WideString&	operator = (const FX_WCHAR* str);

    const CFX_WideString&	operator =(const CFX_WideString& stringSrc);

    const CFX_WideString&	operator =(const CFX_WideStringC& stringSrc);

    const CFX_WideString&	operator += (const FX_WCHAR* str);

    const CFX_WideString&	operator += (FX_WCHAR ch);

    const CFX_WideString&	operator += (const CFX_WideString& str);

    const CFX_WideString&	operator += (const CFX_WideStringC& str);

    bool operator== (const wchar_t* ptr) const { return Equal(ptr); }
    bool operator== (const CFX_WideStringC& str) const { return Equal(str); }
    bool operator== (const CFX_WideString& other) const { return Equal(other); }

    bool operator!= (const wchar_t* ptr) const { return !(*this == ptr); }
    bool operator!= (const CFX_WideStringC& str) const {
        return !(*this == str);
    }
    bool operator!= (const CFX_WideString& other) const {
        return !(*this == other);
    }

    bool operator< (const CFX_WideString& str) const {
        int result = wmemcmp(c_str(), str.c_str(), std::min(GetLength(), str.GetLength()));
        return result < 0 || (result == 0 && GetLength() < str.GetLength());
    }

    FX_WCHAR				GetAt(FX_STRSIZE nIndex) const
    {
        return m_pData ? m_pData->m_String[nIndex] : 0;
    }

    FX_WCHAR				operator[](FX_STRSIZE nIndex) const
    {
        return m_pData ? m_pData->m_String[nIndex] : 0;
    }

    void					SetAt(FX_STRSIZE nIndex, FX_WCHAR ch);

    int						Compare(const FX_WCHAR* str) const;

    int						Compare(const CFX_WideString& str) const;

    int						CompareNoCase(const FX_WCHAR* str) const;

    bool Equal(const wchar_t* ptr) const;
    bool Equal(const CFX_WideStringC& str) const;
    bool Equal(const CFX_WideString& other) const;

    CFX_WideString			Mid(FX_STRSIZE first) const;

    CFX_WideString			Mid(FX_STRSIZE first, FX_STRSIZE count) const;

    CFX_WideString			Left(FX_STRSIZE count) const;

    CFX_WideString			Right(FX_STRSIZE count) const;

    FX_STRSIZE				Insert(FX_STRSIZE index, FX_WCHAR ch);

    FX_STRSIZE				Delete(FX_STRSIZE index, FX_STRSIZE count = 1);

    void					Format(const FX_WCHAR* lpszFormat, ... );

    void					FormatV(const FX_WCHAR* lpszFormat, va_list argList);

    void					MakeLower();

    void					MakeUpper();

    void					TrimRight();

    void					TrimRight(FX_WCHAR chTarget);

    void					TrimRight(const FX_WCHAR* lpszTargets);

    void					TrimLeft();

    void					TrimLeft(FX_WCHAR chTarget);

    void					TrimLeft(const FX_WCHAR* lpszTargets);

    void					Reserve(FX_STRSIZE len);

    FX_WCHAR*				GetBuffer(FX_STRSIZE len);

    void					ReleaseBuffer(FX_STRSIZE len = -1);

    int						GetInteger() const;

    FX_FLOAT				GetFloat() const;

    FX_STRSIZE				Find(const FX_WCHAR* lpszSub, FX_STRSIZE start = 0) const;

    FX_STRSIZE				Find(FX_WCHAR ch, FX_STRSIZE start = 0) const;

    FX_STRSIZE				Replace(const FX_WCHAR* lpszOld, const FX_WCHAR* lpszNew);

    FX_STRSIZE				Remove(FX_WCHAR ch);

    CFX_ByteString			UTF8Encode() const;

    CFX_ByteString			UTF16LE_Encode() const;

    void					ConvertFrom(const CFX_ByteString& str, CFX_CharMap* pCharMap = NULL);

protected:
    class StringData {
      public:
        static StringData* Create(int nLen);
        void Retain() { ++m_nRefs; }
        void Release() { if (--m_nRefs <= 0) FX_Free(this); }

        intptr_t    m_nRefs;  // Would prefer ssize_t, but no windows support.
        FX_STRSIZE  m_nDataLength;
        FX_STRSIZE  m_nAllocLength;
        FX_WCHAR    m_String[1];

      private:
        StringData(FX_STRSIZE dataLen, FX_STRSIZE allocLen)
                : m_nRefs(1), m_nDataLength(dataLen), m_nAllocLength(allocLen) {
            FXSYS_assert(dataLen >= 0);
            FXSYS_assert(allocLen >= 0);
            FXSYS_assert(dataLen <= allocLen);
            m_String[dataLen] = 0;
        }
        ~StringData() = delete;
    };

    void                    CopyBeforeWrite();
    void                    AllocBeforeWrite(FX_STRSIZE nLen);
    void                    ConcatInPlace(FX_STRSIZE nSrcLen, const FX_WCHAR* lpszSrcData);
    void                    ConcatCopy(FX_STRSIZE nSrc1Len, const FX_WCHAR* lpszSrc1Data, FX_STRSIZE nSrc2Len, const FX_WCHAR* lpszSrc2Data);
    void                    AssignCopy(FX_STRSIZE nSrcLen, const FX_WCHAR* lpszSrcData);
    void                    AllocCopy(CFX_WideString& dest, FX_STRSIZE nCopyLen, FX_STRSIZE nCopyIndex) const;

    StringData* m_pData;
    friend class fxcrt_WideStringConcatInPlace_Test;
};
inline CFX_WideStringC::CFX_WideStringC(const CFX_WideString& src)
{
    m_Ptr = src.c_str();
    m_Length = src.GetLength();
}
inline CFX_WideStringC& CFX_WideStringC::operator = (const CFX_WideString& src)
{
    m_Ptr = src.c_str();
    m_Length = src.GetLength();
    return *this;
}

inline CFX_WideString operator + (const CFX_WideStringC& str1, const CFX_WideStringC& str2)
{
    return CFX_WideString(str1, str2);
}
inline CFX_WideString operator + (const CFX_WideStringC& str1, const FX_WCHAR* str2)
{
    return CFX_WideString(str1, str2);
}
inline CFX_WideString operator + (const FX_WCHAR* str1, const CFX_WideStringC& str2)
{
    return CFX_WideString(str1, str2);
}
inline CFX_WideString operator + (const CFX_WideStringC& str1, FX_WCHAR ch)
{
    return CFX_WideString(str1, CFX_WideStringC(ch));
}
inline CFX_WideString operator + (FX_WCHAR ch, const CFX_WideStringC& str2)
{
    return CFX_WideString(ch, str2);
}
inline CFX_WideString operator + (const CFX_WideString& str1, const CFX_WideString& str2)
{
    return CFX_WideString(str1, str2);
}
inline CFX_WideString operator + (const CFX_WideString& str1, FX_WCHAR ch)
{
    return CFX_WideString(str1, CFX_WideStringC(ch));
}
inline CFX_WideString operator + (FX_WCHAR ch, const CFX_WideString& str2)
{
    return CFX_WideString(ch, str2);
}
inline CFX_WideString operator + (const CFX_WideString& str1, const FX_WCHAR* str2)
{
    return CFX_WideString(str1, str2);
}
inline CFX_WideString operator + (const FX_WCHAR* str1, const CFX_WideString& str2)
{
    return CFX_WideString(str1, str2);
}
inline CFX_WideString operator + (const CFX_WideString& str1, const CFX_WideStringC& str2)
{
    return CFX_WideString(str1, str2);
}
inline CFX_WideString operator + (const CFX_WideStringC& str1, const CFX_WideString& str2)
{
    return CFX_WideString(str1, str2);
}
inline bool operator== (const wchar_t* lhs, const CFX_WideString& rhs) {
    return rhs == lhs;
}
inline bool operator== (const CFX_WideStringC& lhs, const CFX_WideString& rhs) {
    return rhs == lhs;
}
inline bool operator!= (const wchar_t* lhs, const CFX_WideString& rhs) {
    return rhs != lhs;
}
inline bool operator!= (const CFX_WideStringC& lhs, const CFX_WideString& rhs) {
    return rhs != lhs;
}
FX_FLOAT FX_atof(const CFX_ByteStringC& str);
void FX_atonum(const CFX_ByteStringC& str, FX_BOOL& bInteger, void* pData);
FX_STRSIZE FX_ftoa(FX_FLOAT f, FX_CHAR* buf);
CFX_ByteString	FX_UTF8Encode(const FX_WCHAR* pwsStr, FX_STRSIZE len);
inline CFX_ByteString	FX_UTF8Encode(const CFX_WideStringC& wsStr)
{
    return FX_UTF8Encode(wsStr.GetPtr(), wsStr.GetLength());
}
inline CFX_ByteString	FX_UTF8Encode(const CFX_WideString &wsStr)
{
    return FX_UTF8Encode(wsStr.c_str(), wsStr.GetLength());
}

#endif  // CORE_INCLUDE_FXCRT_FX_STRING_H_
