1 | // Tencent is pleased to support the open source community by making RapidJSON available. |
2 | // |
3 | // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. |
4 | // |
5 | // Licensed under the MIT License (the "License"); you may not use this file except |
6 | // in compliance with the License. You may obtain a copy of the License at |
7 | // |
8 | // http://opensource.org/licenses/MIT |
9 | // |
10 | // Unless required by applicable law or agreed to in writing, software distributed |
11 | // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR |
12 | // CONDITIONS OF ANY KIND, either express or implied. See the License for the |
13 | // specific language governing permissions and limitations under the License. |
14 | |
15 | #ifndef RAPIDJSON_INTERNAL_STRFUNC_H_ |
16 | #define RAPIDJSON_INTERNAL_STRFUNC_H_ |
17 | |
18 | #include "../stream.h" |
19 | |
20 | RAPIDJSON_NAMESPACE_BEGIN |
21 | namespace internal { |
22 | |
23 | //! Custom strlen() which works on different character types. |
24 | /*! \tparam Ch Character type (e.g. char, wchar_t, short) |
25 | \param s Null-terminated input string. |
26 | \return Number of characters in the string. |
27 | \note This has the same semantics as strlen(), the return value is not number of Unicode codepoints. |
28 | */ |
29 | template <typename Ch> |
30 | inline SizeType StrLen(const Ch* s) { |
31 | const Ch* p = s; |
32 | while (*p) ++p; |
33 | return SizeType(p - s); |
34 | } |
35 | |
36 | //! Returns number of code points in a encoded string. |
37 | template<typename Encoding> |
38 | bool CountStringCodePoint(const typename Encoding::Ch* s, SizeType length, SizeType* outCount) { |
39 | GenericStringStream<Encoding> is(s); |
40 | const typename Encoding::Ch* end = s + length; |
41 | SizeType count = 0; |
42 | while (is.src_ < end) { |
43 | unsigned codepoint; |
44 | if (!Encoding::Decode(is, &codepoint)) |
45 | return false; |
46 | count++; |
47 | } |
48 | *outCount = count; |
49 | return true; |
50 | } |
51 | |
52 | } // namespace internal |
53 | RAPIDJSON_NAMESPACE_END |
54 | |
55 | #endif // RAPIDJSON_INTERNAL_STRFUNC_H_ |
56 | |