// Copyright (C) 2023 Free Software Foundation, Inc. // // This file is part of the GNU Proc Macro Library. This library is free // software; you can redistribute it and/or modify it under the // terms of the GNU General Public License as published by the // Free Software Foundation; either version 3, or (at your option) // any later version. // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // Under Section 7 of GPL version 3, you are granted additional // permissions described in the GCC Runtime Library Exception, version // 3.1, as published by the Free Software Foundation. // You should have received a copy of the GNU General Public License and // a copy of the GCC Runtime Library Exception along with this program; // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see // . #ifndef LITERAL_H #define LITERAL_H #include #include #include namespace Literal { enum UnsignedTag { UNSIGNED_8, UNSIGNED_16, UNSIGNED_32, UNSIGNED_64, UNSIGNED_128 }; struct Payload128 { std::uint64_t low; std::uint64_t high; }; union UnsignedPayload { std::uint8_t unsigned8; std::uint16_t unsigned16; std::uint32_t unsigned32; std::uint64_t unsigned64; Payload128 unsigned128; }; struct Unsigned { UnsignedTag tag; UnsignedPayload payload; }; enum SignedTag { SIGNED_8, SIGNED_16, SIGNED_32, SIGNED_64, SIGNED_128 }; union SignedPayload { std::int8_t signed8; std::int16_t signed16; std::int32_t signed32; std::int64_t signed64; }; struct Signed { SignedTag tag; SignedPayload payload; }; enum LiteralTag { STRING, BYTE_STRING, CHAR, UNSIGNED, SIGNED, USIZE, ISIZE, FLOAT32, FLOAT64 }; struct StringPayload { unsigned char *data; std::uint64_t len; }; struct ByteStringPayload { std::uint8_t *data; std::uint64_t size; }; struct UnsignedSuffixPayload { Unsigned value; bool suffix; }; struct SignedSuffixPayload { Signed value; bool suffix; }; struct UsizePayload { std::uint64_t value; bool suffix; }; struct IsizePayload { std::int64_t value; bool suffix; }; struct Float32Payload { float value; bool suffix; }; struct Float64Payload { double value; bool suffix; }; union LiteralPayload { StringPayload string_payload; ByteStringPayload byte_string_payload; std::uint32_t char_payload; UnsignedSuffixPayload unsigned_payload; SignedSuffixPayload signed_payload; UsizePayload usize_payload; IsizePayload isize_payload; Float32Payload float32_payload; Float64Payload float64_payload; }; struct Literal { LiteralTag tag; LiteralPayload payload; public: Literal clone () const; static Literal make_u8 (std::uint8_t value, bool suffixed = false); static Literal make_u16 (std::uint16_t value, bool suffixed = false); static Literal make_u32 (std::uint32_t value, bool suffixed = false); static Literal make_u64 (std::uint64_t value, bool suffixed = false); static Literal make_i8 (std::int8_t value, bool suffixed = false); static Literal make_i16 (std::int16_t value, bool suffixed = false); static Literal make_i32 (std::int32_t value, bool suffixed = false); static Literal make_i64 (std::int64_t value, bool suffixed = false); static Literal make_string (const std::string &str); static Literal make_string (const unsigned char *str, std::uint64_t len); static Literal make_byte_string (const std::vector &vec); static Literal make_byte_string (const std::uint8_t *bytes, std::uint64_t len); static Literal make_f32 (float value, bool suffixed = false); static Literal make_f64 (double value, bool suffixed = false); static Literal make_char (std::uint32_t ch); static Literal make_usize (std::uint64_t value, bool suffixed = false); static Literal make_isize (std::int64_t value, bool suffixed = false); static Literal make_unsigned (UnsignedSuffixPayload p); static Literal make_signed (SignedSuffixPayload p); static void drop (Literal *lit); }; extern "C" { void Literal__drop (Literal *lit); Literal Literal__string (const unsigned char *str, std::uint64_t len); Literal Literal__byte_string (const std::uint8_t *bytes, std::uint64_t len); bool Literal__from_string (const unsigned char *str, std::uint64_t len, Literal *lit); } } // namespace Literal #endif /* ! LITERAL_H */