JavaScriptCore/runtime/JSStringBuilder.h
changeset 0 4f2f89ce4247
equal deleted inserted replaced
-1:000000000000 0:4f2f89ce4247
       
     1 /*
       
     2  * Copyright (C) 2009 Apple Inc. All rights reserved.
       
     3  *
       
     4  * Redistribution and use in source and binary forms, with or without
       
     5  * modification, are permitted provided that the following conditions
       
     6  * are met:
       
     7  * 1. Redistributions of source code must retain the above copyright
       
     8  *    notice, this list of conditions and the following disclaimer.
       
     9  * 2. Redistributions in binary form must reproduce the above copyright
       
    10  *    notice, this list of conditions and the following disclaimer in the
       
    11  *    documentation and/or other materials provided with the distribution.
       
    12  *
       
    13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
       
    14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
       
    15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
       
    16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
       
    17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
       
    18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
       
    19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
       
    20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
       
    21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
    22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
    23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
       
    24  */
       
    25 
       
    26 #ifndef JSStringBuilder_h
       
    27 #define JSStringBuilder_h
       
    28 
       
    29 #include "ExceptionHelpers.h"
       
    30 #include "JSString.h"
       
    31 #include "Vector.h"
       
    32 
       
    33 namespace JSC {
       
    34 
       
    35 class JSStringBuilder {
       
    36 public:
       
    37     JSStringBuilder()
       
    38         : m_okay(true)
       
    39     {
       
    40     }
       
    41 
       
    42     void append(const UChar u)
       
    43     {
       
    44         m_okay &= buffer.tryAppend(&u, 1);
       
    45     }
       
    46 
       
    47     void append(const char* str)
       
    48     {
       
    49         append(str, strlen(str));
       
    50     }
       
    51 
       
    52     void append(const char* str, size_t len)
       
    53     {
       
    54         m_okay &= buffer.tryReserveCapacity(buffer.size() + len);
       
    55         for (size_t i = 0; i < len; i++) {
       
    56             UChar u = static_cast<unsigned char>(str[i]);
       
    57             m_okay &= buffer.tryAppend(&u, 1);
       
    58         }
       
    59     }
       
    60 
       
    61     void append(const UChar* str, size_t len)
       
    62     {
       
    63         m_okay &= buffer.tryAppend(str, len);
       
    64     }
       
    65 
       
    66     void append(const UString& str)
       
    67     {
       
    68         m_okay &= buffer.tryAppend(str.data(), str.size());
       
    69     }
       
    70 
       
    71     JSValue build(ExecState* exec)
       
    72     {
       
    73         if (!m_okay)
       
    74             return throwOutOfMemoryError(exec);
       
    75         buffer.shrinkToFit();
       
    76         if (!buffer.data())
       
    77             return throwOutOfMemoryError(exec);
       
    78         return jsString(exec, UString::adopt(buffer));
       
    79     }
       
    80 
       
    81 protected:
       
    82     Vector<UChar, 64> buffer;
       
    83     bool m_okay;
       
    84 };
       
    85 
       
    86 template<typename StringType1, typename StringType2>
       
    87 inline JSValue jsMakeNontrivialString(ExecState* exec, StringType1 string1, StringType2 string2)
       
    88 {
       
    89     PassRefPtr<UStringImpl> result = tryMakeString(string1, string2);
       
    90     if (!result)
       
    91         return throwOutOfMemoryError(exec);
       
    92     return jsNontrivialString(exec, result);
       
    93 }
       
    94 
       
    95 template<typename StringType1, typename StringType2, typename StringType3>
       
    96 inline JSValue jsMakeNontrivialString(ExecState* exec, StringType1 string1, StringType2 string2, StringType3 string3)
       
    97 {
       
    98     PassRefPtr<UStringImpl> result = tryMakeString(string1, string2, string3);
       
    99     if (!result)
       
   100         return throwOutOfMemoryError(exec);
       
   101     return jsNontrivialString(exec, result);
       
   102 }
       
   103 
       
   104 template<typename StringType1, typename StringType2, typename StringType3, typename StringType4>
       
   105 inline JSValue jsMakeNontrivialString(ExecState* exec, StringType1 string1, StringType2 string2, StringType3 string3, StringType4 string4)
       
   106 {
       
   107     PassRefPtr<UStringImpl> result = tryMakeString(string1, string2, string3, string4);
       
   108     if (!result)
       
   109         return throwOutOfMemoryError(exec);
       
   110     return jsNontrivialString(exec, result);
       
   111 }
       
   112 
       
   113 template<typename StringType1, typename StringType2, typename StringType3, typename StringType4, typename StringType5>
       
   114 inline JSValue jsMakeNontrivialString(ExecState* exec, StringType1 string1, StringType2 string2, StringType3 string3, StringType4 string4, StringType5 string5)
       
   115 {
       
   116     PassRefPtr<UStringImpl> result = tryMakeString(string1, string2, string3, string4, string5);
       
   117     if (!result)
       
   118         return throwOutOfMemoryError(exec);
       
   119     return jsNontrivialString(exec, result);
       
   120 }
       
   121 
       
   122 template<typename StringType1, typename StringType2, typename StringType3, typename StringType4, typename StringType5, typename StringType6>
       
   123 inline JSValue jsMakeNontrivialString(ExecState* exec, StringType1 string1, StringType2 string2, StringType3 string3, StringType4 string4, StringType5 string5, StringType6 string6)
       
   124 {
       
   125     PassRefPtr<UStringImpl> result = tryMakeString(string1, string2, string3, string4, string5, string6);
       
   126     if (!result)
       
   127         return throwOutOfMemoryError(exec);
       
   128     return jsNontrivialString(exec, result);
       
   129 }
       
   130 
       
   131 }
       
   132 
       
   133 #endif