15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2010 Apple Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer.
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer in the
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    documentation and/or other materials provided with the distribution.
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef StringConcatenate_h
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define StringConcatenate_h
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include <string.h>
3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef WTFString_h
32591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/text/AtomicString.h"
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// This macro is helpful for testing how many intermediate Strings are created while evaluating an
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// expression containing operator+.
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef WTF_STRINGTYPEADAPTER_COPIED_WTF_STRING
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define WTF_STRINGTYPEADAPTER_COPIED_WTF_STRING() ((void)0)
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WTF {
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<typename StringType>
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class StringTypeAdapter {
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<>
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class StringTypeAdapter<char> {
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    StringTypeAdapter<char>(char buffer)
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : m_buffer(buffer)
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned length() { return 1; }
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool is8Bit() { return true; }
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void writeTo(LChar* destination)
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        *destination = m_buffer;
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void writeTo(UChar* destination) { *destination = m_buffer; }
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned char m_buffer;
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<>
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class StringTypeAdapter<LChar> {
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    StringTypeAdapter<LChar>(LChar buffer)
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : m_buffer(buffer)
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned length() { return 1; }
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool is8Bit() { return true; }
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void writeTo(LChar* destination)
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        *destination = m_buffer;
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void writeTo(UChar* destination) { *destination = m_buffer; }
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LChar m_buffer;
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<>
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class StringTypeAdapter<UChar> {
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    StringTypeAdapter<UChar>(UChar buffer)
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : m_buffer(buffer)
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned length() { return 1; }
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool is8Bit() { return m_buffer <= 0xff; }
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void writeTo(LChar* destination)
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(is8Bit());
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        *destination = static_cast<LChar>(m_buffer);
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void writeTo(UChar* destination) { *destination = m_buffer; }
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    UChar m_buffer;
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<>
1187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass WTF_EXPORT StringTypeAdapter<char*> {
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    StringTypeAdapter<char*>(char* buffer)
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : m_buffer(buffer)
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_length(strlen(buffer))
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned length() { return m_length; }
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool is8Bit() { return true; }
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void writeTo(LChar* destination);
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void writeTo(UChar* destination);
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const char* m_buffer;
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned m_length;
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<>
1407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass WTF_EXPORT StringTypeAdapter<LChar*> {
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
1427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    StringTypeAdapter<LChar*>(LChar* buffer);
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned length() { return m_length; }
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool is8Bit() { return true; }
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void writeTo(LChar* destination);
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void writeTo(UChar* destination);
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const LChar* m_buffer;
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned m_length;
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<>
1587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass WTF_EXPORT StringTypeAdapter<const UChar*> {
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
1607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    StringTypeAdapter(const UChar* buffer);
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned length() { return m_length; }
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool is8Bit() { return false; }
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NO_RETURN_DUE_TO_CRASH void writeTo(LChar*)
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
16853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        RELEASE_ASSERT(false);
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void writeTo(UChar* destination);
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const UChar* m_buffer;
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned m_length;
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<>
1797242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass WTF_EXPORT StringTypeAdapter<const char*> {
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
1817242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    StringTypeAdapter<const char*>(const char* buffer);
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned length() { return m_length; }
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool is8Bit() { return true; }
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void writeTo(LChar* destination);
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void writeTo(UChar* destination);
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const char* m_buffer;
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned m_length;
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<>
1977242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass WTF_EXPORT StringTypeAdapter<const LChar*> {
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
1997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    StringTypeAdapter<const LChar*>(const LChar* buffer);
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned length() { return m_length; }
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool is8Bit() { return true; }
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2057242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void writeTo(LChar* destination);
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2077242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void writeTo(UChar* destination);
208926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
209926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)private:
210926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    const LChar* m_buffer;
211926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    unsigned m_length;
212926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)};
213926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
214926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)template<>
2157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass WTF_EXPORT StringTypeAdapter<Vector<char> > {
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    StringTypeAdapter<Vector<char> >(const Vector<char>& buffer)
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : m_buffer(buffer)
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t length() { return m_buffer.size(); }
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool is8Bit() { return true; }
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void writeTo(LChar* destination);
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void writeTo(UChar* destination);
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Vector<char>& m_buffer;
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<>
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class StringTypeAdapter<Vector<LChar> > {
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    StringTypeAdapter<Vector<LChar> >(const Vector<LChar>& buffer)
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : m_buffer(buffer)
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t length() { return m_buffer.size(); }
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool is8Bit() { return true; }
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void writeTo(LChar* destination);
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void writeTo(UChar* destination);
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Vector<LChar>& m_buffer;
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<>
2557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass WTF_EXPORT StringTypeAdapter<String> {
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    StringTypeAdapter<String>(const String& string)
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : m_buffer(string)
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned length() { return m_buffer.length(); }
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool is8Bit() { return m_buffer.isNull() || m_buffer.is8Bit(); }
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2667242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void writeTo(LChar* destination);
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void writeTo(UChar* destination);
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const String& m_buffer;
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<>
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class StringTypeAdapter<AtomicString> {
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    StringTypeAdapter<AtomicString>(const AtomicString& string)
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : m_adapter(string.string())
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned length() { return m_adapter.length(); }
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool is8Bit() { return m_adapter.is8Bit(); }
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void writeTo(LChar* destination) { m_adapter.writeTo(destination); }
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void writeTo(UChar* destination) { m_adapter.writeTo(destination); }
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    StringTypeAdapter<String> m_adapter;
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline void sumWithOverflow(unsigned& total, unsigned addend, bool& overflow)
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned oldTotal = total;
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    total = oldTotal + addend;
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (total < oldTotal)
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        overflow = true;
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<typename StringType1, typename StringType2>
302f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)PassRefPtr<StringImpl> makeString(StringType1 string1, StringType2 string2)
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    StringTypeAdapter<StringType1> adapter1(string1);
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    StringTypeAdapter<StringType2> adapter2(string2);
3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool overflow = false;
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned length = adapter1.length();
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    sumWithOverflow(length, adapter2.length(), overflow);
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (overflow)
311d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return nullptr;
3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (adapter1.is8Bit() && adapter2.is8Bit()) {
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        LChar* buffer;
315f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        RefPtr<StringImpl> resultImpl = StringImpl::createUninitialized(length, buffer);
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!resultImpl)
317d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return nullptr;
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        LChar* result = buffer;
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        adapter1.writeTo(result);
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result += adapter1.length();
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        adapter2.writeTo(result);
3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return resultImpl.release();
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    UChar* buffer;
328f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    RefPtr<StringImpl> resultImpl = StringImpl::createUninitialized(length, buffer);
3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!resultImpl)
330d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return nullptr;
3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    UChar* result = buffer;
3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    adapter1.writeTo(result);
3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result += adapter1.length();
3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    adapter2.writeTo(result);
3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return resultImpl.release();
3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WTF
3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
342591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/text/StringOperators.h"
3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
344