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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
// License: see LICENSE file at root directory of `master` branch

//! # Dia-range
//!
//! _Ranges for all integers_
//!
//! ## Project
//!
//! - Repository: <https://bitbucket.org/haibison/dia-range>
//! - License: Nice License 1.0.0 _(see LICENSE file at root directory of `master` branch)_
//! - _This project follows [Semantic Versioning 2.0.0]_
//!
//! ## Features
//!
//! - `RangeType` and `Ops` traits are implemented for all integer primitive types. So you can use [`Range`][crate::Range] on them.
//! - Currently only [`Range`][crate::Range] is recommended for use. Both `RangeType` and `Ops` traits are intended for internal use only.
//!   However they have to be available publicly for `Range` to be valid. So their APIs look weird. It's _not_ recommended to build things from
//!   them.
//!
//! ## Examples
//!
//! ```
//! use dia_range::Range;
//!
//! // First type i16 is for indexes; second type (u16) is for estimating range size.
//! // You can ignore second type, the compiler will figure it out.
//! let mut range: Range<i16, _> = Range::new(50, 100);
//! assert!(range.contains(&99));
//! assert!(range.expand(101));
//! assert!(range.expand(103) == false);
//! assert!(range.contains(&101));
//! assert_eq!(range.estimate_size(), 52);
//!
//! // Merging
//! assert_eq!(range.merge(&Range::new(100, 150)), Some(Range::new(50, 150)));
//! ```
//!
//! [Semantic Versioning 2.0.0]: https://semver.org/spec/v2.0.0.html
//! [crate::Range]: struct.Range.html

#![warn(missing_docs)]

mod ops;
mod range;
mod range_iter;
mod range_type;

pub use ops::*;
pub use range::*;
pub use range_iter::*;
pub use range_type::*;

pub mod version_info;

// ╔═════════════════╗
// ║   IDENTIFIERS   ║
// ╚═════════════════╝

macro_rules! code_name  { () => { "dia-range" }}
macro_rules! version    { () => { "0.9.0" }}

/// # Crate name
pub const NAME: &str = "Dia-range";

/// # Crate code name
pub const CODE_NAME: &str = code_name!();

/// # ID of this crate
pub const ID: &str = concat!(
    "6f5e1e6d-5c6d71b4-7146e717-a2f94636-d582d84d-b3c6e5f5-44547bdc-282b83a2-",
    "24eea9b3-9042e30c-34608b08-f50864b9-8fa1c03e-f1f10f7b-2fe21805-7fa01f01",
);

/// # Crate version
pub const VERSION: &str = version!();

/// # Crate release date (year/month/day)
pub const RELEASE_DATE: (u16, u8, u8) = (2019, 6, 16);

/// # Tag, which can be used for logging...
pub const TAG: &str = concat!(code_name!(), "::6f5e1e6d::", version!());

// ╔════════════════════╗
// ║   IMPLEMENTATION   ║
// ╚════════════════════╝

#[test]
fn test_crate_version() {
    assert_eq!(VERSION, env!("CARGO_PKG_VERSION"));
}