Adding set and other types
[satune.git] / src / set.cc
1 /*
2  * To change this license header, choose License Headers in Project Properties.
3  * To change this template file, choose Tools | Templates
4  * and open the template in the editor.
5  */
6
7 #include "set.h"
8 #include <stddef.h>
9 #include <cassert>
10
11 Node::Node(uint64 val, Node* r, Node* l){
12     range=false;
13     beginOrVal=val;
14     left = l;
15     right=r;
16 }
17
18 Node::Node(uint64 val):Node(val, NULL, NULL){}
19
20 Node::Node(uint64 begin, uint64 end, Node* r, Node* l){
21     range=true;
22     beginOrVal=begin;
23     this->end= end;
24     right=r;
25     left=l;
26 }
27
28 Node::Node(uint64 begin, uint64 end):Node(begin, end, NULL, NULL){}
29
30 Comparison Node::compare(uint64 val){
31     if(range){
32         if(val> end)
33             return GREATER;
34         else if(val < beginOrVal)
35             return LESS;
36         else
37             return EQUAL;
38     }else{
39         if(val> beginOrVal)
40             return GREATER;
41         else if(val< beginOrVal)
42             return LESS;
43         else
44             return EQUAL;
45     }
46 }
47
48 void Node::addNode(Node* n){
49     assert(!n->isRange());
50     Comparison comp = compare(n->getBeginOrRange());
51     if(comp == GREATER){
52         if(right!=NULL)
53             right->addNode(n);
54         else
55             right=n;
56     }else if(comp == LESS){
57         if(left!= NULL)
58             left->addNode(n);
59         else
60             left = n;
61     }
62         
63 }
64
65 Set::Set(Type t, uint64* elements, int num){
66     type=t;
67     size=num;
68     for(int i=0; i<num; i++){
69         addItem(elements[i]);
70     }
71 }
72
73 Set::Set(Type t, uint64 lowrange, uint64 highrange){
74     assert(highrange>lowrange);
75     type =t;
76     size = highrange-lowrange+1;
77     root = new Node(lowrange,highrange);
78 }
79
80 Set::Set(Type t): type(t),
81         size(0),
82         root(NULL)
83 {
84 }
85
86 void Set::addItem(uint64 element){
87     Node* n = new Node(element);
88     if(root==NULL)
89         root=n;
90     else
91         root->addNode(n);
92 }
93
94