aboutsummaryrefslogtreecommitdiff
path: root/std/endian.zig
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2016-08-17 20:11:04 -0700
committerAndrew Kelley <superjoe30@gmail.com>2016-08-17 20:11:04 -0700
commited50bd1b655ff028bdd650edecdcdd6675f1dee0 (patch)
tree18bab13e2631f2ec55fdd5447baa7134c282e4a4 /std/endian.zig
parent0fbb9e09ea89ea24ec214b244e1de9574516c74c (diff)
downloadzig-ed50bd1b655ff028bdd650edecdcdd6675f1dee0.tar.gz
zig-ed50bd1b655ff028bdd650edecdcdd6675f1dee0.zip
progress toward stack trace printing
Diffstat (limited to 'std/endian.zig')
-rw-r--r--std/endian.zig21
1 files changed, 21 insertions, 0 deletions
diff --git a/std/endian.zig b/std/endian.zig
new file mode 100644
index 0000000000..dbf518d801
--- /dev/null
+++ b/std/endian.zig
@@ -0,0 +1,21 @@
+pub inline fn swapIfLe(inline T: type, x: T) -> T {
+ swapIf(false, T, x)
+}
+
+pub inline fn swapIfBe(inline T: type, x: T) -> T {
+ swapIf(true, T, x)
+}
+
+pub inline fn swapIf(is_be: bool, inline T: type, x: T) -> T {
+ if (@compileVar("is_big_endian") == is_be) swap(T, x) else x
+}
+
+pub fn swap(inline T: type, x: T) -> T {
+ const x_slice = ([]u8)((&const x)[0...1]);
+ var result: T = undefined;
+ const result_slice = ([]u8)((&result)[0...1]);
+ for (result_slice) |*b, i| {
+ *b = x_slice[@sizeOf(T) - i - 1];
+ }
+ return result;
+}