summaryrefslogtreecommitdiffstats
path: root/sources/fabrice/simulator/simulTypes.ml
blob: 7d760498a53174e2ae012f854602f09283b59911 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
type state = ON | OFF | DEAD

type peer = {
    i : int;

    descr : string;

    avail : float;
    mutable session : int;
    mutable day : bool;    
    mutable state : state;
    mutable real_avail : int;
    mutable real_decs : int;
  }

  
let _ = Random.self_init ()

  
module ChildrenArray : sig
    
    type t

    val length : t -> int
    val create : int -> t
    val mem : t -> int -> bool
    val add : t -> int -> unit
    val iteri : (int -> int -> unit) -> t -> unit
    val remove : t -> int -> unit
    val random : t -> int
    val clear : t -> unit
      
    val of_list : int list -> t
      
  end = struct

    type t = {
        mutable length : int; 
        array : int array;
      }
      
    let create n = {
        length = 0;
        array = Array.create n 0;
      }

    let clear t = t.length <- 0
      
    let add t i = 
      let len = t.length in
      t.array.(len) <- i;
      t.length <- len + 1

    let remove t pos =
      let tab = t.array in
      let len = t.length-1 in 
      tab.(pos) <- tab.(len);
      t.length <- len
    
    let length t = t.length

    let iteri f t =
      let rec iter i t =
        let len = t.length in
        if i < len then begin
            f i t.array.(i);
            if len > t.length then iter i t else
              iter (i+1) t
          end
      in
      iter 0 t

    let mem t v =     
      let rec iter i t =
        (i < t.length) &&
        (t.array.(i) = v || iter (i+1) t)
      in
      iter 0 t

    let random t =
       t.array.(Random.int t.length)

    let of_list list = 
      let array = Array.of_list list in
      {
        array = array;
        length = Array.length array;
      }
      
  end