use crate::mem::transmute;
use crate::{assert_unsafe_precondition, fmt};
#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
#[unstable(feature = "ascii_char", issue = "110998")]
#[repr(u8)]
pub enum AsciiChar {
#[unstable(feature = "ascii_char_variants", issue = "110998")]
Null = 0,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
StartOfHeading = 1,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
StartOfText = 2,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
EndOfText = 3,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
EndOfTransmission = 4,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
Enquiry = 5,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
Acknowledge = 6,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
Bell = 7,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
Backspace = 8,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
CharacterTabulation = 9,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
LineFeed = 10,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
LineTabulation = 11,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
FormFeed = 12,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
CarriageReturn = 13,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
ShiftOut = 14,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
ShiftIn = 15,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
DataLinkEscape = 16,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
DeviceControlOne = 17,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
DeviceControlTwo = 18,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
DeviceControlThree = 19,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
DeviceControlFour = 20,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
NegativeAcknowledge = 21,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
SynchronousIdle = 22,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
EndOfTransmissionBlock = 23,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
Cancel = 24,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
EndOfMedium = 25,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
Substitute = 26,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
Escape = 27,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
InformationSeparatorFour = 28,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
InformationSeparatorThree = 29,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
InformationSeparatorTwo = 30,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
InformationSeparatorOne = 31,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
Space = 32,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
ExclamationMark = 33,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
QuotationMark = 34,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
NumberSign = 35,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
DollarSign = 36,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
PercentSign = 37,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
Ampersand = 38,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
Apostrophe = 39,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
LeftParenthesis = 40,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
RightParenthesis = 41,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
Asterisk = 42,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
PlusSign = 43,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
Comma = 44,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
HyphenMinus = 45,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
FullStop = 46,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
Solidus = 47,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
Digit0 = 48,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
Digit1 = 49,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
Digit2 = 50,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
Digit3 = 51,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
Digit4 = 52,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
Digit5 = 53,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
Digit6 = 54,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
Digit7 = 55,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
Digit8 = 56,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
Digit9 = 57,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
Colon = 58,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
Semicolon = 59,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
LessThanSign = 60,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
EqualsSign = 61,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
GreaterThanSign = 62,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
QuestionMark = 63,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
CommercialAt = 64,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
CapitalA = 65,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
CapitalB = 66,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
CapitalC = 67,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
CapitalD = 68,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
CapitalE = 69,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
CapitalF = 70,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
CapitalG = 71,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
CapitalH = 72,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
CapitalI = 73,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
CapitalJ = 74,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
CapitalK = 75,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
CapitalL = 76,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
CapitalM = 77,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
CapitalN = 78,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
CapitalO = 79,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
CapitalP = 80,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
CapitalQ = 81,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
CapitalR = 82,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
CapitalS = 83,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
CapitalT = 84,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
CapitalU = 85,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
CapitalV = 86,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
CapitalW = 87,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
CapitalX = 88,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
CapitalY = 89,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
CapitalZ = 90,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
LeftSquareBracket = 91,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
ReverseSolidus = 92,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
RightSquareBracket = 93,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
CircumflexAccent = 94,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
LowLine = 95,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
GraveAccent = 96,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
SmallA = 97,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
SmallB = 98,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
SmallC = 99,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
SmallD = 100,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
SmallE = 101,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
SmallF = 102,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
SmallG = 103,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
SmallH = 104,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
SmallI = 105,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
SmallJ = 106,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
SmallK = 107,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
SmallL = 108,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
SmallM = 109,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
SmallN = 110,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
SmallO = 111,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
SmallP = 112,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
SmallQ = 113,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
SmallR = 114,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
SmallS = 115,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
SmallT = 116,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
SmallU = 117,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
SmallV = 118,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
SmallW = 119,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
SmallX = 120,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
SmallY = 121,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
SmallZ = 122,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
LeftCurlyBracket = 123,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
VerticalLine = 124,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
RightCurlyBracket = 125,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
Tilde = 126,
#[unstable(feature = "ascii_char_variants", issue = "110998")]
Delete = 127,
}
impl AsciiChar {
#[unstable(feature = "ascii_char", issue = "110998")]
#[inline]
pub const fn from_u8(b: u8) -> Option<Self> {
if b <= 127 {
Some(unsafe { Self::from_u8_unchecked(b) })
} else {
None
}
}
#[unstable(feature = "ascii_char", issue = "110998")]
#[inline]
pub const unsafe fn from_u8_unchecked(b: u8) -> Self {
unsafe { transmute(b) }
}
#[unstable(feature = "ascii_char", issue = "110998")]
#[inline]
pub const fn digit(d: u8) -> Option<Self> {
if d < 10 {
Some(unsafe { Self::digit_unchecked(d) })
} else {
None
}
}
#[unstable(feature = "ascii_char", issue = "110998")]
#[inline]
pub const unsafe fn digit_unchecked(d: u8) -> Self {
assert_unsafe_precondition!(
check_language_ub,
"`ascii::Char::digit_unchecked` input cannot exceed 9.",
(d: u8 = d) => d < 10
);
unsafe {
let byte = b'0'.unchecked_add(d);
Self::from_u8_unchecked(byte)
}
}
#[unstable(feature = "ascii_char", issue = "110998")]
#[inline]
pub const fn to_u8(self) -> u8 {
self as u8
}
#[unstable(feature = "ascii_char", issue = "110998")]
#[inline]
pub const fn to_char(self) -> char {
self as u8 as char
}
#[unstable(feature = "ascii_char", issue = "110998")]
#[inline]
pub const fn as_str(&self) -> &str {
crate::slice::from_ref(self).as_str()
}
}
macro_rules! into_int_impl {
($($ty:ty)*) => {
$(
#[unstable(feature = "ascii_char", issue = "110998")]
impl From<AsciiChar> for $ty {
#[inline]
fn from(chr: AsciiChar) -> $ty {
chr as u8 as $ty
}
}
)*
}
}
into_int_impl!(u8 u16 u32 u64 u128 char);
impl [AsciiChar] {
#[unstable(feature = "ascii_char", issue = "110998")]
#[inline]
pub const fn as_str(&self) -> &str {
let ascii_ptr: *const Self = self;
let str_ptr = ascii_ptr as *const str;
unsafe { &*str_ptr }
}
#[unstable(feature = "ascii_char", issue = "110998")]
#[inline]
pub const fn as_bytes(&self) -> &[u8] {
self.as_str().as_bytes()
}
}
#[unstable(feature = "ascii_char", issue = "110998")]
impl fmt::Display for AsciiChar {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
<str as fmt::Display>::fmt(self.as_str(), f)
}
}
#[unstable(feature = "ascii_char", issue = "110998")]
impl fmt::Debug for AsciiChar {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
use AsciiChar::{Apostrophe, Null, ReverseSolidus as Backslash};
fn backslash(a: AsciiChar) -> ([AsciiChar; 6], usize) {
([Apostrophe, Backslash, a, Apostrophe, Null, Null], 4)
}
let (buf, len) = match self {
AsciiChar::Null => backslash(AsciiChar::Digit0),
AsciiChar::CharacterTabulation => backslash(AsciiChar::SmallT),
AsciiChar::CarriageReturn => backslash(AsciiChar::SmallR),
AsciiChar::LineFeed => backslash(AsciiChar::SmallN),
AsciiChar::ReverseSolidus => backslash(AsciiChar::ReverseSolidus),
AsciiChar::Apostrophe => backslash(AsciiChar::Apostrophe),
_ if self.to_u8().is_ascii_control() => {
const HEX_DIGITS: [AsciiChar; 16] = *b"0123456789abcdef".as_ascii().unwrap();
let byte = self.to_u8();
let hi = HEX_DIGITS[usize::from(byte >> 4)];
let lo = HEX_DIGITS[usize::from(byte & 0xf)];
([Apostrophe, Backslash, AsciiChar::SmallX, hi, lo, Apostrophe], 6)
}
_ => ([Apostrophe, *self, Apostrophe, Null, Null, Null], 3),
};
f.write_str(buf[..len].as_str())
}
}