Home | History | Annotate | Download | only in utils
      1 /*
      2  * Copyright (C) 2005 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef ANDROID_STRING16_H
     18 #define ANDROID_STRING16_H
     19 
     20 #include <string> // for std::string
     21 
     22 #include <utils/Errors.h>
     23 #include <utils/String8.h>
     24 #include <utils/TypeHelpers.h>
     25 
     26 // ---------------------------------------------------------------------------
     27 
     28 extern "C" {
     29 
     30 }
     31 
     32 // ---------------------------------------------------------------------------
     33 
     34 namespace android {
     35 
     36 // ---------------------------------------------------------------------------
     37 
     38 class String8;
     39 
     40 // DO NOT USE: please use std::u16string
     41 
     42 //! This is a string holding UTF-16 characters.
     43 class String16
     44 {
     45 public:
     46     /* use String16(StaticLinkage) if you're statically linking against
     47      * libutils and declaring an empty static String16, e.g.:
     48      *
     49      *   static String16 sAStaticEmptyString(String16::kEmptyString);
     50      *   static String16 sAnotherStaticEmptyString(sAStaticEmptyString);
     51      */
     52     enum StaticLinkage { kEmptyString };
     53 
     54                                 String16();
     55     explicit                    String16(StaticLinkage);
     56                                 String16(const String16& o);
     57                                 String16(const String16& o,
     58                                          size_t len,
     59                                          size_t begin=0);
     60     explicit                    String16(const char16_t* o);
     61     explicit                    String16(const char16_t* o, size_t len);
     62     explicit                    String16(const String8& o);
     63     explicit                    String16(const char* o);
     64     explicit                    String16(const char* o, size_t len);
     65 
     66                                 ~String16();
     67 
     68     inline  const char16_t*     string() const;
     69 
     70 private:
     71     static inline std::string   std_string(const String16& str);
     72 public:
     73             size_t              size() const;
     74             void                setTo(const String16& other);
     75             status_t            setTo(const char16_t* other);
     76             status_t            setTo(const char16_t* other, size_t len);
     77             status_t            setTo(const String16& other,
     78                                       size_t len,
     79                                       size_t begin=0);
     80 
     81             status_t            append(const String16& other);
     82             status_t            append(const char16_t* other, size_t len);
     83 
     84     inline  String16&           operator=(const String16& other);
     85 
     86     inline  String16&           operator+=(const String16& other);
     87     inline  String16            operator+(const String16& other) const;
     88 
     89             status_t            insert(size_t pos, const char16_t* chrs);
     90             status_t            insert(size_t pos,
     91                                        const char16_t* chrs, size_t len);
     92 
     93             ssize_t             findFirst(char16_t c) const;
     94             ssize_t             findLast(char16_t c) const;
     95 
     96             bool                startsWith(const String16& prefix) const;
     97             bool                startsWith(const char16_t* prefix) const;
     98 
     99             bool                contains(const char16_t* chrs) const;
    100 
    101             status_t            makeLower();
    102 
    103             status_t            replaceAll(char16_t replaceThis,
    104                                            char16_t withThis);
    105 
    106             status_t            remove(size_t len, size_t begin=0);
    107 
    108     inline  int                 compare(const String16& other) const;
    109 
    110     inline  bool                operator<(const String16& other) const;
    111     inline  bool                operator<=(const String16& other) const;
    112     inline  bool                operator==(const String16& other) const;
    113     inline  bool                operator!=(const String16& other) const;
    114     inline  bool                operator>=(const String16& other) const;
    115     inline  bool                operator>(const String16& other) const;
    116 
    117     inline  bool                operator<(const char16_t* other) const;
    118     inline  bool                operator<=(const char16_t* other) const;
    119     inline  bool                operator==(const char16_t* other) const;
    120     inline  bool                operator!=(const char16_t* other) const;
    121     inline  bool                operator>=(const char16_t* other) const;
    122     inline  bool                operator>(const char16_t* other) const;
    123 
    124     inline                      operator const char16_t*() const;
    125 
    126 private:
    127             const char16_t*     mString;
    128 };
    129 
    130 // String16 can be trivially moved using memcpy() because moving does not
    131 // require any change to the underlying SharedBuffer contents or reference count.
    132 ANDROID_TRIVIAL_MOVE_TRAIT(String16)
    133 
    134 // ---------------------------------------------------------------------------
    135 // No user servicable parts below.
    136 
    137 inline int compare_type(const String16& lhs, const String16& rhs)
    138 {
    139     return lhs.compare(rhs);
    140 }
    141 
    142 inline int strictly_order_type(const String16& lhs, const String16& rhs)
    143 {
    144     return compare_type(lhs, rhs) < 0;
    145 }
    146 
    147 inline const char16_t* String16::string() const
    148 {
    149     return mString;
    150 }
    151 
    152 inline std::string String16::std_string(const String16& str)
    153 {
    154     return std::string(String8(str).string());
    155 }
    156 
    157 inline String16& String16::operator=(const String16& other)
    158 {
    159     setTo(other);
    160     return *this;
    161 }
    162 
    163 inline String16& String16::operator+=(const String16& other)
    164 {
    165     append(other);
    166     return *this;
    167 }
    168 
    169 inline String16 String16::operator+(const String16& other) const
    170 {
    171     String16 tmp(*this);
    172     tmp += other;
    173     return tmp;
    174 }
    175 
    176 inline int String16::compare(const String16& other) const
    177 {
    178     return strzcmp16(mString, size(), other.mString, other.size());
    179 }
    180 
    181 inline bool String16::operator<(const String16& other) const
    182 {
    183     return strzcmp16(mString, size(), other.mString, other.size()) < 0;
    184 }
    185 
    186 inline bool String16::operator<=(const String16& other) const
    187 {
    188     return strzcmp16(mString, size(), other.mString, other.size()) <= 0;
    189 }
    190 
    191 inline bool String16::operator==(const String16& other) const
    192 {
    193     return strzcmp16(mString, size(), other.mString, other.size()) == 0;
    194 }
    195 
    196 inline bool String16::operator!=(const String16& other) const
    197 {
    198     return strzcmp16(mString, size(), other.mString, other.size()) != 0;
    199 }
    200 
    201 inline bool String16::operator>=(const String16& other) const
    202 {
    203     return strzcmp16(mString, size(), other.mString, other.size()) >= 0;
    204 }
    205 
    206 inline bool String16::operator>(const String16& other) const
    207 {
    208     return strzcmp16(mString, size(), other.mString, other.size()) > 0;
    209 }
    210 
    211 inline bool String16::operator<(const char16_t* other) const
    212 {
    213     return strcmp16(mString, other) < 0;
    214 }
    215 
    216 inline bool String16::operator<=(const char16_t* other) const
    217 {
    218     return strcmp16(mString, other) <= 0;
    219 }
    220 
    221 inline bool String16::operator==(const char16_t* other) const
    222 {
    223     return strcmp16(mString, other) == 0;
    224 }
    225 
    226 inline bool String16::operator!=(const char16_t* other) const
    227 {
    228     return strcmp16(mString, other) != 0;
    229 }
    230 
    231 inline bool String16::operator>=(const char16_t* other) const
    232 {
    233     return strcmp16(mString, other) >= 0;
    234 }
    235 
    236 inline bool String16::operator>(const char16_t* other) const
    237 {
    238     return strcmp16(mString, other) > 0;
    239 }
    240 
    241 inline String16::operator const char16_t*() const
    242 {
    243     return mString;
    244 }
    245 
    246 }; // namespace android
    247 
    248 // ---------------------------------------------------------------------------
    249 
    250 #endif // ANDROID_STRING16_H
    251