summaryrefslogtreecommitdiffstats
path: root/src/Pid.vala
blob: 3f71df7833f2dec57f92632a6d70d080b50a581f (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
namespace Eva {
  public class Pid : Object, Term {
    public string node {get; construct;}
    public uint num {get; construct;}
    public uint serial {get; construct;}
    public uint creation {get; construct;}
    
    public Pid(Erl.Pid pid) {
      this.create(array_to_string(pid.node, Erl.MAXATOMLEN), pid.num, pid.serial, pid.creation);
    }
    
    private Pid.create(string node0, uint num0, uint serial0, uint creation0) {
      Object(node: node0, num: num0, serial: serial0, creation: creation0);
    }
    
    public string to_string() {
      return "<" + node + "." + num.to_string() + "." + serial.to_string() + ">";
    }
    
    protected bool do_match(Term o, Gee.Map<string, Term> vars, Gee.Map<string, string> aliases) {
      if(o is Var) {
        return o.do_match(this, vars, aliases);
      }
      
      if(!(o is Pid))
        return false;
      
      Pid p = o as Pid;
      
      return (node == p.node && num == p.num && serial == p.serial && creation == p.creation);
    }
    
    public void encode(Erl.Buffer buffer) {
      Erl.Pid pid = Erl.Pid();
      char[]? nodedata = string_to_array(node);
      assert(nodedata != null);
      
      Memory.copy(pid.node, nodedata, int.min(Erl.MAXATOMLEN, nodedata.length));
      pid.node[int.min(Erl.MAXATOMLEN, nodedata.length)] = 0;
      
      pid.num = num;
      pid.serial = serial;
      pid.creation = creation;
      
      buffer.encode_pid(pid);
    }
  }
}