home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Tools / Languages / Caml Light 0.61 / Source / src / lib / fvect.ml < prev    next >
Encoding:
Text File  |  1993-09-24  |  2.1 KB  |  92 lines  |  [TEXT/MPS ]

  1. (* Operations on vectors, without sanity checks *)
  2.  
  3. #open "eq";;
  4. #open "int";;
  5.  
  6. let make_matrix dimx dimy init =
  7.   let res = make_vect dimx [||] in
  8.   for x = 0 to pred dimx do
  9.     res.(x) <- make_vect dimy init
  10.   done;
  11.   res
  12. ;;  
  13.  
  14. let blit_vect v1 start1 v2 start2 len =
  15.   if start1 < start2 then
  16.     (* Top-down copy *)
  17.     for i = pred len downto 0 do
  18.       v2.(start2 + i) <- v1.(start1 + i)
  19.     done
  20.   else
  21.     (* Bottom-up copy *)
  22.     for i = 0 to pred len do
  23.       v2.(start2 + i) <- v1.(start1 + i)
  24.     done
  25. ;;
  26.  
  27. let fill_vect v start len init =
  28.   for i = start to pred(start + len) do v.(i) <- init done
  29. ;;
  30.  
  31. let copy_vect v =
  32.   if vect_length v == 0 then v else begin
  33.     let v' = make_vect (vect_length v) v.(0) in
  34.     blit_vect v 1 v' 1 (vect_length v - 1);
  35.     v'
  36.   end
  37. ;;
  38.  
  39. let concat_vect v1 v2 =
  40.   if vect_length v1 == 0 then copy_vect v2
  41.   else if vect_length v2 == 0 then copy_vect v1
  42.   else begin
  43.     let v = make_vect (vect_length v1 + vect_length v2) v1.(0) in
  44.       blit_vect v1 1 v 1 (vect_length v1 - 1);
  45.       blit_vect v2 0 v (vect_length v1) (vect_length v2);
  46.       v
  47.     end
  48. ;;
  49. let sub_vect v start len =
  50.   if len == 0 then [| |] else begin
  51.     let res = make_vect len v.(start) in
  52.       for i = 1 to pred len do
  53.         res.(i) <- v.(start+i)
  54.       done;
  55.       res
  56.     end
  57. ;;
  58. let list_of_vect v =
  59.   let rec list_of i =
  60.     if i >= vect_length v then [] else v.(i) :: list_of (succ i)
  61.   in list_of 0
  62. ;;
  63. let vect_of_list = function
  64.     [] -> [| |]
  65.   | a::rest as l ->
  66.       let v = make_vect (list__list_length l) a in
  67.       let rec fill_vect i = function
  68.          []  -> ()
  69.       | a::l -> v.(i) <- a; fill_vect (succ i) l
  70.       in
  71.         fill_vect 1 rest; v
  72. ;;
  73. let do_vect f v =
  74.   for i = 0 to pred(vect_length v) do f v.(i) done
  75. ;;
  76. let map_vect f v =
  77.   if vect_length v == 0 then [| |] else begin
  78.     let res = make_vect (vect_length v) (f v.(0)) in
  79.       for i = 1 to pred(vect_length v) do
  80.         res.(i) <- f v.(i)
  81.       done;
  82.       res
  83.     end
  84. ;;
  85. let map_vect_list f v =
  86.   let rec map i =
  87.     if i >= vect_length v then [] else f v.(i) :: map (succ i)
  88.   in
  89.     map 0
  90. ;;
  91.  
  92.