1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
// Copyright 2017 The UNIC Project Developers.
//
// See the COPYRIGHT file at the top-level directory of this distribution.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.


#![forbid(unsafe_code, missing_docs)]

//! # UNIC — UCD — Utils
//!
//! A component of [`unic`: Unicode and Internationalization Crates for Rust](/unic/).
//!
//! Utilities for working with Unicode Code Points
//!
//! ## Definitions
//!
//! * [**Unicode Code Point**](http://unicode.org/glossary/#code_point)
//! * [**Unicode Scalar Value**](http://unicode.org/glossary/#unicode_scalar_value)


use std::char::from_u32;
use std::ops::Range;


/// Range of valid Unicode Code Points.
pub const CODEPOINTS_RANGE: Range<u32> = 0x0..(0x10FFFF + 1);

/// Range of Surroate Code Points, which are not Unicde Scalar Values.
const SCALAR_VALUE_RANGE_1: Range<u32> = 0x0..0xD800;
const SCALAR_VALUE_RANGE_2: Range<u32> = (0xDFFF + 1)..(0x10_FFFF + 1);

/// Check a code-point against `SURROGATE_CODEPOINTS_RANGE`.
#[inline]
pub fn iter_all_chars() -> Box<Iterator<Item = char>> {
    Box::new(
        // TODO: use char::from_u32_unchecked()
        SCALAR_VALUE_RANGE_1
            .chain(SCALAR_VALUE_RANGE_2)
            .filter_map(from_u32),
    )
}