Browse Source

Add `unsafe_write` to `uuid` package

Feoramund 1 year ago
parent
commit
339b2b23f6
1 changed files with 45 additions and 4 deletions
  1. 45 4
      core/encoding/uuid/writing.odin

+ 45 - 4
core/encoding/uuid/writing.odin

@@ -8,12 +8,53 @@ import "core:strings"
 /*
 Write a UUID in the 8-4-4-4-12 format.
 
+This procedure performs error checking with every byte written.
+
+If you can guarantee beforehand that your stream has enough space to hold the
+UUID (32 bytes), then it is better to use `unsafe_write` instead as that will
+be faster.
+
+Inputs:
+- w: A writable stream.
+- id: The identifier to convert.
+
+Returns:
+- error: An `io` error, if one occurred, otherwise `nil`.
+*/
+write :: proc(w: io.Writer, id: Identifier) -> (error: io.Error) #no_bounds_check {
+	write_octet :: proc (w: io.Writer, octet: u8) -> io.Error #no_bounds_check {
+		high_nibble := octet >> 4
+		low_nibble := octet & 0xF
+
+		io.write_byte(w, strconv.digits[high_nibble]) or_return
+		io.write_byte(w, strconv.digits[low_nibble]) or_return
+		return nil
+	}
+
+	for index in  0 ..<  4 { write_octet(w, id[index]) or_return }
+	io.write_byte(w, '-') or_return
+	for index in  4 ..<  6 { write_octet(w, id[index]) or_return }
+	io.write_byte(w, '-') or_return
+	for index in  6 ..<  8 { write_octet(w, id[index]) or_return }
+	io.write_byte(w, '-') or_return
+	for index in  8 ..< 10 { write_octet(w, id[index]) or_return }
+	io.write_byte(w, '-') or_return
+	for index in 10 ..< 16 { write_octet(w, id[index]) or_return }
+
+	return nil
+}
+
+/*
+Write a UUID in the 8-4-4-4-12 format.
+
+This procedure performs no error checking on the underlying stream.
+
 Inputs:
 - w: A writable stream.
 - id: The identifier to convert.
 */
-write :: proc(w: io.Writer, id: Identifier) #no_bounds_check {
-	write_octet :: proc (w: io.Writer, octet: u8) {
+unsafe_write :: proc(w: io.Writer, id: Identifier) #no_bounds_check {
+	write_octet :: proc (w: io.Writer, octet: u8) #no_bounds_check {
 		high_nibble := octet >> 4
 		low_nibble := octet & 0xF
 
@@ -56,7 +97,7 @@ to_string_allocated :: proc(
 ) #optional_allocator_error {
 	buf := make([]byte, EXPECTED_LENGTH, allocator, loc) or_return
 	builder := strings.builder_from_bytes(buf[:])
-	write(strings.to_writer(&builder), id)
+	unsafe_write(strings.to_writer(&builder), id)
 	return strings.to_string(builder), nil
 }
 
@@ -80,7 +121,7 @@ to_string_buffer :: proc(
 ) {
 	assert(len(buffer) >= EXPECTED_LENGTH, "The buffer provided is not at least 32 bytes large.", loc)
 	builder := strings.builder_from_bytes(buffer)
-	write(strings.to_writer(&builder), id)
+	unsafe_write(strings.to_writer(&builder), id)
 	return strings.to_string(builder)
 }