source: icGREP/icgrep-devel/icgrep/utf16_encoder.cpp

Last change on this file was 5924, checked in by cameron, 15 months ago

Various cleanups

File size: 2.3 KB
RevLine 
[5045]1/*
2 *  Copyright (c) 2014 International Characters.
3 *  This software is licensed to the public under the Open Software License 3.0.
4 *  icgrep is a trademark of International Characters.
5 */
6
7#include <utf16_encoder.h>
8#include <assert.h>
9#include <algorithm>
10#include <stdexcept>
[5924]11#include <string>
[5045]12
[5278]13using namespace UCD;
[5045]14
15namespace cc {
16
17bool UTF16_Encoder::isHi_Surrogate(const codepoint_t cp) {
18    return (cp >= 0xD800) && (cp <= 0xDBFF);
19}
20
21bool UTF16_Encoder::isLo_Surrogate(const codepoint_t cp) {
[5046]22    return (cp >= 0xDC00) && (cp <= 0xDFFF);
[5045]23}
24
25codepoint_t UTF16_Encoder::encodingByte(const codepoint_t cp, const unsigned n) {
26    codepoint_t retVal = 0;
27    const unsigned len = length(cp);
[5046]28    if (len == 1) {
29        retVal = cp;
30    }
31    else {
32        codepoint_t code = cp - 0x010000;
33        if (n == 1) {
34                retVal = (code >> 10) | 0xD800;
[5045]35        }
[5046]36        if (n == 2) {
37                retVal = (code & 0x3FF) | 0xDC00;
[5045]38        }
[5046]39    }
40    return retVal;
[5045]41}
42
43unsigned UTF16_Encoder::length(const codepoint_t cp) {
[5046]44    if (cp <= 0xFFFF) {
45        return 1;
46    }
47    else {
48        return 2;
49    }
[5045]50}
51
52codepoint_t UTF16_Encoder::maxCodePoint(const unsigned length) {
[5046]53    if (length == 1) {
54        return 0xFFFF;
55    }
56    else if (length == 2) {
57        return 0x10FFFF;
58    } 
[5045]59    throw std::runtime_error("Unexpected UTF16 Length: " + std::to_string(length));
60}
61
62bool UTF16_Encoder::isLowCodePointAfterByte(const codepoint_t cp, const unsigned n) {
63    const auto l = length(cp);
64    for (auto i = n; i != l; ++i) {
65        if (encodingByte(cp, i + 1) != 0xDC00) {
66            return false;
67        }
68    }
69    return true;
70}
71
72bool UTF16_Encoder::isHighCodePointAfterByte(const codepoint_t cp, const unsigned n) {
73    const auto l = length(cp);
74    for (auto i = n; i != l; ++i) {
75        if (encodingByte(cp, i + 1) != 0xDFFF) {
76            return false;
77        }
78    }
79    return true;
80}
81
[5278]82codepoint_t UTF16_Encoder::minCodePointWithCommonBytes(const codepoint_t cp, const unsigned n) {
[5045]83    const auto len = length(cp);
84    const auto mask = (static_cast<codepoint_t>(1) << (len - n) * 10) - 1;
85    const auto lo_cp = cp &~ mask;
86    return (lo_cp == 0) ? mask + 1 : lo_cp;
87}
88
[5278]89codepoint_t UTF16_Encoder::maxCodePointWithCommonBytes(const codepoint_t cp, const unsigned n) {
[5045]90    const auto len = length(cp);
91    const auto mask = (static_cast<codepoint_t>(1) << (len - n) * 10) - 1;
92    return cp | mask;
93}
94
95}
Note: See TracBrowser for help on using the repository browser.