From c1be85b1867a200b7ed6d5ae9c28675186d135c8 Mon Sep 17 00:00:00 2001 From: Spiros Eliopoulos Date: Fri, 30 Mar 2018 14:53:00 +0000 Subject: [PATCH] bigstringaf: switch to using bigstringaf --- faraday.opam | 2 +- lib/bigstring.ml | 76 ---------------------------------------- lib/bigstring.mli | 37 ------------------- lib/faraday.ml | 64 ++++++++++++++++----------------- lib/faraday.mli | 2 +- lib/jbuild | 2 +- lib_test/jbuild | 2 +- lib_test/test_faraday.ml | 3 +- 8 files changed, 37 insertions(+), 151 deletions(-) delete mode 100644 lib/bigstring.ml delete mode 100644 lib/bigstring.mli diff --git a/faraday.opam b/faraday.opam index a4fda7d..ca608d5 100644 --- a/faraday.opam +++ b/faraday.opam @@ -15,6 +15,6 @@ build-test: [ depends: [ "jbuilder" {build & >= "1.0+beta10"} "alcotest" {test & >= "0.4.1"} - "base-bigarray" + "bigstringaf" ] available: [ ocaml-version >= "4.02.0" ] diff --git a/lib/bigstring.ml b/lib/bigstring.ml deleted file mode 100644 index 5565a4f..0000000 --- a/lib/bigstring.ml +++ /dev/null @@ -1,76 +0,0 @@ -type bigstring = - (char, Bigarray.int8_unsigned_elt, Bigarray.c_layout) Bigarray.Array1.t - -type t = bigstring - -let create size = Bigarray.(Array1.create char c_layout size) -let empty = create 0 - -module BA1 = Bigarray.Array1 - -let length t = BA1.dim t -let unsafe_get = BA1.unsafe_get -let unsafe_set = BA1.unsafe_set - -let blit src src_off dst dst_off len = - BA1.(blit (sub src src_off len) (sub dst dst_off len)) - -let blit_from_string src src_off dst dst_off len = - for i = 0 to len - 1 do - BA1.unsafe_set dst (dst_off + i) (String.unsafe_get src (src_off + i)) - done - -let blit_from_bytes src src_off dst dst_off len = - blit_from_string (Bytes.unsafe_to_string src) src_off dst dst_off len - -let blit_to_bytes src src_off dst dst_off len = - for i = 0 to len - 1 do - Bytes.unsafe_set dst (dst_off +i) (BA1.unsafe_get src (src_off + i)) - done - -let sub t ~off ~len = - BA1.sub t off len - -let substring t ~off ~len = - let b = Bytes.create len in - blit_to_bytes t off b 0 len; - Bytes.unsafe_to_string b - -let of_string ~off ~len s = - let b = create len in - blit_from_string s off b 0 len; - b - -external caml_bigstring_set_16u : bigstring -> off:int -> int -> unit = "%caml_bigstring_set16u" -external caml_bigstring_set_32u : bigstring -> off:int -> int32 -> unit = "%caml_bigstring_set32u" -external caml_bigstring_set_64u : bigstring -> off:int -> int64 -> unit = "%caml_bigstring_set64u" - -module Swap = struct - external bswap16 : int -> int = "%bswap16" - external bswap_int32 : int32 -> int32 = "%bswap_int32" - external bswap_int64 : int64 -> int64 = "%bswap_int64" - - let caml_bigstring_set_16u bs ~off i = - caml_bigstring_set_16u bs ~off (bswap16 i) - - let caml_bigstring_set_32u bs ~off i = - caml_bigstring_set_32u bs ~off (bswap_int32 i) - - let caml_bigstring_set_64u bs ~off i = - caml_bigstring_set_64u bs ~off (bswap_int64 i) -end - -let unsafe_set_16_le, unsafe_set_16_be = - if Sys.big_endian - then Swap.caml_bigstring_set_16u, caml_bigstring_set_16u - else caml_bigstring_set_16u , Swap.caml_bigstring_set_16u - -let unsafe_set_32_le, unsafe_set_32_be = - if Sys.big_endian - then Swap.caml_bigstring_set_32u, caml_bigstring_set_32u - else caml_bigstring_set_32u , Swap.caml_bigstring_set_32u - -let unsafe_set_64_le, unsafe_set_64_be = - if Sys.big_endian - then Swap.caml_bigstring_set_64u, caml_bigstring_set_64u - else caml_bigstring_set_64u , Swap.caml_bigstring_set_64u diff --git a/lib/bigstring.mli b/lib/bigstring.mli deleted file mode 100644 index e0cb6e5..0000000 --- a/lib/bigstring.mli +++ /dev/null @@ -1,37 +0,0 @@ -(** {1 Bigstrings} - - This module is not part of Angstrom's public API to as not not cause - confusion, usability issues, and linking errors related to naming conflicts - with other existing libraries. - - All of these operations skip bounds checks when possible. *) - -type t = - (char, Bigarray.int8_unsigned_elt, Bigarray.c_layout) Bigarray.Array1.t - -val create : int -> t -val empty : t - -val of_string : off:int -> len:int -> string -> t - -val length : t -> int -val unsafe_get : t -> int -> char -val unsafe_set : t -> int -> char -> unit - -val blit : t -> int -> t -> int -> int -> unit -val blit_from_string : string -> int -> t -> int -> int -> unit -val blit_from_bytes : Bytes.t -> int -> t -> int -> int -> unit - -val blit_to_bytes : t -> int -> Bytes.t -> int -> int -> unit - -val sub : t -> off:int -> len:int -> t -val substring : t -> off:int -> len:int -> string - -val unsafe_set_16_le : t -> off:int -> int -> unit -val unsafe_set_16_be : t -> off:int -> int -> unit - -val unsafe_set_32_le : t -> off:int -> int32 -> unit -val unsafe_set_32_be : t -> off:int -> int32 -> unit - -val unsafe_set_64_le : t -> off:int -> int64 -> unit -val unsafe_set_64_be : t -> off:int -> int64 -> unit diff --git a/lib/faraday.ml b/lib/faraday.ml index 2fc5ab1..74fd79a 100644 --- a/lib/faraday.ml +++ b/lib/faraday.ml @@ -32,7 +32,7 @@ ----------------------------------------------------------------------------*) -type bigstring = Bigstring.t +type bigstring = Bigstringaf.t type 'a iovec = { buffer : 'a @@ -145,8 +145,8 @@ module Buffers = Deque(struct let sentinel = let deadbeef = "\222\173\190\239" in let len = String.length deadbeef in - let buffer = Bigstring.create len in - String.iteri (Bigstring.unsafe_set buffer) deadbeef; + let buffer = Bigstringaf.create len in + String.iteri (Bigstringaf.unsafe_set buffer) deadbeef; { buffer; off = 0; len } end) module Flushes = Deque(struct @@ -184,7 +184,7 @@ let of_bigstring buffer = ; yield = false } let create size = - of_bigstring (Bigstring.create size) + of_bigstring (Bigstringaf.create size) let writable_exn t = if t.closed then @@ -208,7 +208,7 @@ let flush t f = else Flushes.enqueue (t.bytes_received, f) t.flushed let free_bytes_in_buffer t = - let buf_len = Bigstring.length t.buffer in + let buf_len = Bigstringaf.length t.buffer in buf_len - t.write_pos let schedule_bigstring t ?(off=0) ?len a = @@ -216,7 +216,7 @@ let schedule_bigstring t ?(off=0) ?len a = flush_buffer t; let len = match len with - | None -> Bigstring.length a - off + | None -> Bigstringaf.length a - off | Some len -> len in if len > 0 then schedule_iovec t ~off ~len a @@ -224,7 +224,7 @@ let schedule_bigstring t ?(off=0) ?len a = let ensure_space t len = if free_bytes_in_buffer t < len then begin flush_buffer t; - t.buffer <- Bigstring.create (max (Bigstring.length t.buffer) len); + t.buffer <- Bigstringaf.create (max (Bigstringaf.length t.buffer) len); t.write_pos <- 0; t.scheduled_pos <- 0 end @@ -237,74 +237,74 @@ let write_gen t ~length ~blit ?(off=0) ?len a = | Some len -> len in ensure_space t len; - blit a off t.buffer t.write_pos len; + blit a ~src_off:off t.buffer ~dst_off:t.write_pos ~len; t.write_pos <- t.write_pos + len let write_string = let length = String.length in - let blit = Bigstring.blit_from_string in + let blit = Bigstringaf.unsafe_blit_from_string in fun t ?off ?len a -> write_gen t ~length ~blit ?off ?len a let write_bytes = let length = Bytes.length in - let blit = Bigstring.blit_from_bytes in + let blit = Bigstringaf.unsafe_blit_from_bytes in fun t ?off ?len a -> write_gen t ~length ~blit ?off ?len a let write_bigstring = - let length = Bigstring.length in - let blit = Bigstring.blit in + let length = Bigstringaf.length in + let blit = Bigstringaf.unsafe_blit in fun t ?off ?len a -> write_gen t ~length ~blit ?off ?len a let write_char t c = writable_exn t; ensure_space t 1; - Bigstring.unsafe_set t.buffer t.write_pos c; + Bigstringaf.unsafe_set t.buffer t.write_pos c; t.write_pos <- t.write_pos + 1 let write_uint8 t b = writable_exn t; ensure_space t 1; - Bigstring.unsafe_set t.buffer t.write_pos (Char.unsafe_chr b); + Bigstringaf.unsafe_set t.buffer t.write_pos (Char.unsafe_chr b); t.write_pos <- t.write_pos + 1 module BE = struct let write_uint16 t i = writable_exn t; ensure_space t 2; - Bigstring.unsafe_set_16_be t.buffer ~off:t.write_pos i; + Bigstringaf.unsafe_set_int16_be t.buffer t.write_pos i; t.write_pos <- t.write_pos + 2 let write_uint32 t i = writable_exn t; ensure_space t 4; - Bigstring.unsafe_set_32_be t.buffer ~off:t.write_pos i; + Bigstringaf.unsafe_set_int32_be t.buffer t.write_pos i; t.write_pos <- t.write_pos + 4 let write_uint48 t i = writable_exn t; ensure_space t 6; - Bigstring.unsafe_set_32_be t.buffer ~off:t.write_pos + Bigstringaf.unsafe_set_int32_be t.buffer t.write_pos Int64.(to_int32 (shift_right_logical i 4)); - Bigstring.unsafe_set_16_be t.buffer ~off:(t.write_pos + 2) + Bigstringaf.unsafe_set_int16_be t.buffer (t.write_pos + 2) Int64.(to_int i); t.write_pos <- t.write_pos + 6 let write_uint64 t i = writable_exn t; ensure_space t 8; - Bigstring.unsafe_set_64_be t.buffer ~off:t.write_pos i; + Bigstringaf.unsafe_set_int64_be t.buffer t.write_pos i; t.write_pos <- t.write_pos + 8 let write_float t f = writable_exn t; ensure_space t 4; - Bigstring.unsafe_set_32_be t.buffer ~off:t.write_pos (Int32.bits_of_float f); + Bigstringaf.unsafe_set_int32_be t.buffer t.write_pos (Int32.bits_of_float f); t.write_pos <- t.write_pos + 4 let write_double t d = writable_exn t; ensure_space t 8; - Bigstring.unsafe_set_64_be t.buffer ~off:t.write_pos (Int64.bits_of_float d); + Bigstringaf.unsafe_set_int64_be t.buffer t.write_pos (Int64.bits_of_float d); t.write_pos <- t.write_pos + 8 end @@ -312,40 +312,40 @@ module LE = struct let write_uint16 t i = writable_exn t; ensure_space t 2; - Bigstring.unsafe_set_16_le t.buffer ~off:t.write_pos i; + Bigstringaf.unsafe_set_int16_le t.buffer t.write_pos i; t.write_pos <- t.write_pos + 2 let write_uint32 t i = writable_exn t; ensure_space t 4; - Bigstring.unsafe_set_32_le t.buffer ~off:t.write_pos i; + Bigstringaf.unsafe_set_int32_le t.buffer t.write_pos i; t.write_pos <- t.write_pos + 4 let write_uint48 t i = writable_exn t; ensure_space t 6; - Bigstring.unsafe_set_16_le t.buffer ~off:t.write_pos + Bigstringaf.unsafe_set_int16_le t.buffer t.write_pos Int64.(to_int i); - Bigstring.unsafe_set_32_le t.buffer ~off:(t.write_pos + 2) + Bigstringaf.unsafe_set_int32_le t.buffer (t.write_pos + 2) Int64.(to_int32 (shift_right_logical i 2)); t.write_pos <- t.write_pos + 6 let write_uint64 t i = writable_exn t; ensure_space t 8; - Bigstring.unsafe_set_64_le t.buffer ~off:t.write_pos i; + Bigstringaf.unsafe_set_int64_le t.buffer t.write_pos i; t.write_pos <- t.write_pos + 8 let write_float t f = writable_exn t; ensure_space t 4; - Bigstring.unsafe_set_32_le t.buffer ~off:t.write_pos (Int32.bits_of_float f); + Bigstringaf.unsafe_set_int32_le t.buffer t.write_pos (Int32.bits_of_float f); t.write_pos <- t.write_pos + 4 let write_double t d = writable_exn t; ensure_space t 8; - Bigstring.unsafe_set_64_le t.buffer ~off:t.write_pos (Int64.bits_of_float d); + Bigstringaf.unsafe_set_int64_le t.buffer t.write_pos (Int64.bits_of_float d); t.write_pos <- t.write_pos + 8 end @@ -443,7 +443,7 @@ let serialize_to_string t = let pos = ref 0 in List.iter (function | { buffer; off; len } -> - Bigstring.blit_to_bytes buffer off bytes !pos len; + Bigstringaf.unsafe_blit_to_bytes buffer ~src_off:off bytes ~dst_off:!pos ~len; pos := !pos + len) iovecs; shift t len; @@ -457,17 +457,17 @@ let serialize_to_bigstring t = match operation t with | `Writev iovecs -> let len = IOVec.lengthv iovecs in - let bs = Bigstring.create len in + let bs = Bigstringaf.create len in let pos = ref 0 in List.iter (function | { buffer; off; len } -> - Bigstring.blit buffer off bs !pos len; + Bigstringaf.unsafe_blit buffer ~src_off:off bs ~dst_off:!pos ~len; pos := !pos + len) iovecs; shift t len; assert (operation t = `Close); bs - | `Close -> Bigstring.create 0 + | `Close -> Bigstringaf.create 0 | `Yield -> assert false let drain = diff --git a/lib/faraday.mli b/lib/faraday.mli index b32c18d..4c5dcbc 100644 --- a/lib/faraday.mli +++ b/lib/faraday.mli @@ -96,7 +96,7 @@ val write_bigstring : t -> ?off:int -> ?len:int -> bigstring -> unit val write_gen : t -> length:('a -> int) - -> blit:('a -> int -> bigstring -> int -> int -> unit) + -> blit:('a -> src_off:int -> bigstring -> dst_off:int -> len:int -> unit) -> ?off:int -> ?len:int -> 'a -> unit diff --git a/lib/jbuild b/lib/jbuild index 0998686..c106993 100644 --- a/lib/jbuild +++ b/lib/jbuild @@ -4,5 +4,5 @@ ((name faraday) (public_name faraday) (libraries - (bigarray)) + (bigstringaf)) (flags (:standard -safe-string)))) diff --git a/lib_test/jbuild b/lib_test/jbuild index 5fb6a2c..30d8fb2 100644 --- a/lib_test/jbuild +++ b/lib_test/jbuild @@ -9,4 +9,4 @@ ((name runtest) (package faraday) (deps (test_faraday.exe)) - (action (run ${<})))) \ No newline at end of file + (action (run ${<})))) diff --git a/lib_test/test_faraday.ml b/lib_test/test_faraday.ml index 46c51c6..a9b2295 100644 --- a/lib_test/test_faraday.ml +++ b/lib_test/test_faraday.ml @@ -9,8 +9,7 @@ let bigstring_of_string str = buf let string_of_bigstring b = - let module Bigstring = Faraday__Bigstring in - Bigstring.substring ~off:0 ~len:(Bigstring.length b) b + Bigstringaf.substring ~off:0 ~len:(Bigstringaf.length b) b let serialize_to_bigstring' t = serialize_to_bigstring t