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

Last change on this file since 6135 was 5924, checked in by cameron, 14 months ago

Various cleanups

File size: 2.3 KB
Line 
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>
11#include <string>
12
13using namespace UCD;
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) {
22    return (cp >= 0xDC00) && (cp <= 0xDFFF);
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);
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;
35        }
36        if (n == 2) {
37                retVal = (code & 0x3FF) | 0xDC00;
38        }
39    }
40    return retVal;
41}
42
43unsigned UTF16_Encoder::length(const codepoint_t cp) {
44    if (cp <= 0xFFFF) {
45        return 1;
46    }
47    else {
48        return 2;
49    }
50}
51
52codepoint_t UTF16_Encoder::maxCodePoint(const unsigned length) {
53    if (length == 1) {
54        return 0xFFFF;
55    }
56    else if (length == 2) {
57        return 0x10FFFF;
58    } 
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
82codepoint_t UTF16_Encoder::minCodePointWithCommonBytes(const codepoint_t cp, const unsigned n) {
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
89codepoint_t UTF16_Encoder::maxCodePointWithCommonBytes(const codepoint_t cp, const unsigned n) {
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.