aboutsummaryrefslogtreecommitdiff
path: root/lib/std/builtin.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2020-03-03 09:44:13 -0500
committerAndrew Kelley <andrew@ziglang.org>2020-03-03 09:44:13 -0500
commitd1cb16aace5f5996cf2556d07fd3418a951b31df (patch)
treee154f475be8de6f0b0c486cf1baa1557c3f12b65 /lib/std/builtin.zig
parent3418a332ab3a120f21354d98579d7a3a2dcb523b (diff)
parent387418277a4964714ddaec3336a602ec87dde0f9 (diff)
downloadzig-d1cb16aace5f5996cf2556d07fd3418a951b31df.tar.gz
zig-d1cb16aace5f5996cf2556d07fd3418a951b31df.zip
Merge remote-tracking branch 'origin/master' into llvm10
Diffstat (limited to 'lib/std/builtin.zig')
-rw-r--r--lib/std/builtin.zig59
1 files changed, 57 insertions, 2 deletions
diff --git a/lib/std/builtin.zig b/lib/std/builtin.zig
index f57998c567..08fc85871b 100644
--- a/lib/std/builtin.zig
+++ b/lib/std/builtin.zig
@@ -185,6 +185,7 @@ pub const TypeInfo = union(enum) {
child: type,
is_allowzero: bool,
+ /// This field is an optional type.
/// The type of the sentinel is the element type of the pointer, which is
/// the value of the `child` field in this struct. However there is no way
/// to refer to that type here, so we use `var`.
@@ -206,6 +207,7 @@ pub const TypeInfo = union(enum) {
len: comptime_int,
child: type,
+ /// This field is an optional type.
/// The type of the sentinel is the element type of the array, which is
/// the value of the `child` field in this struct. However there is no way
/// to refer to that type here, so we use `var`.
@@ -398,7 +400,60 @@ pub const LinkMode = enum {
pub const Version = struct {
major: u32,
minor: u32,
- patch: u32,
+ patch: u32 = 0,
+
+ pub const Range = struct {
+ min: Version,
+ max: Version,
+
+ pub fn includesVersion(self: LinuxVersionRange, ver: Version) bool {
+ if (self.min.compare(ver) == .gt) return false;
+ if (self.max.compare(ver) == .lt) return false;
+ return true;
+ }
+ };
+
+ pub fn order(lhs: Version, rhs: Version) std.math.Order {
+ if (lhs.major < rhs.major) return .lt;
+ if (lhs.major > rhs.major) return .gt;
+ if (lhs.minor < rhs.minor) return .lt;
+ if (lhs.minor > rhs.minor) return .gt;
+ if (lhs.patch < rhs.patch) return .lt;
+ if (lhs.patch > rhs.patch) return .gt;
+ return .eq;
+ }
+
+ pub fn parse(text: []const u8) !Version {
+ var it = std.mem.separate(text, ".");
+ return Version{
+ .major = try std.fmt.parseInt(u32, it.next() orelse return error.InvalidVersion, 10),
+ .minor = try std.fmt.parseInt(u32, it.next() orelse "0", 10),
+ .patch = try std.fmt.parseInt(u32, it.next() orelse "0", 10),
+ };
+ }
+
+ pub fn format(
+ self: Version,
+ comptime fmt: []const u8,
+ options: std.fmt.FormatOptions,
+ context: var,
+ comptime Error: type,
+ comptime output: fn (@TypeOf(context), []const u8) Error!void,
+ ) Error!void {
+ if (fmt.len == 0) {
+ if (self.patch == 0) {
+ if (self.minor == 0) {
+ return std.fmt.format(context, Error, output, "{}", .{self.major});
+ } else {
+ return std.fmt.format(context, Error, output, "{}.{}", .{ self.major, self.minor });
+ }
+ } else {
+ return std.fmt.format(context, Error, output, "{}.{}.{}", .{ self.major, self.minor, self.patch });
+ }
+ } else {
+ @compileError("Unknown format string: '" ++ fmt ++ "'");
+ }
+ }
};
/// This data structure is used by the Zig language code generation and
@@ -476,7 +531,7 @@ pub fn default_panic(msg: []const u8, error_return_trace: ?*StackTrace) noreturn
root.os.panic(msg, error_return_trace);
unreachable;
}
- switch (os) {
+ switch (os.tag) {
.freestanding => {
while (true) {
@breakpoint();