add .gitignore
[swift-upb.git] / bin64.cpp
1 /*
2  *  bin64.cpp
3  *  swift
4  *
5  *  Created by Victor Grishchenko on 10/10/09.
6  *  Copyright 2009 Delft University of Technology. All rights reserved.
7  *
8  */
9 #include "bin64.h"
10
11 const uint64_t bin64_t::NONE = 0xffffffffffffffffULL;
12 const uint64_t bin64_t::ALL = 0x7fffffffffffffffULL;
13 const uint32_t bin64_t::NONE32 = 0xffffffffU;
14 const uint32_t bin64_t::ALL32 = 0x7fffffffU;
15
16 uint32_t bin64_t::to32() const {
17     if (v<0xffffffff && v!=0x7fffffff)
18         return (uint32_t)v;
19     if (v==ALL)
20         return ALL32;
21     return NONE32;
22 }
23
24 bin64_t::bin64_t(const uint32_t val) {
25     if (val==ALL32)
26         v = ALL;
27     else if (val==NONE32)
28         v = NONE;
29     else
30         v = val;
31 }
32
33 bin64_t bin64_t::next_dfsio (uint8_t floor) {
34     /*while (ret.is_right())
35         ret = ret.parent();
36     ret = ret.sibling();
37     while (ret.layer()>floor)
38         ret = ret.left();*/
39     if (is_right()) {
40         return parent();
41     } else {
42         bin64_t ret = sibling();
43         while (ret.layer()>floor)
44             ret = ret.left();
45         return ret;
46     }
47 }
48
49 int bin64_t::peaks (uint64_t length, bin64_t* peaks) {
50     int pp=0;
51     uint8_t layer = 0;
52     while (length) {
53         if (length&1) 
54             peaks[pp++] = bin64_t(layer,length^1);
55         length>>=1;
56         layer++;
57     }
58     for(int i=0; i<(pp>>1); i++) {
59         uint64_t memo = peaks[pp-1-i];
60         peaks[pp-1-i] = peaks[i];
61         peaks[i] = memo;
62     }
63     peaks[pp] = NONE;
64     return pp;
65 }
66
67 #include <stdio.h>
68
69 const char* bin64_t::str () const {
70     static char _b64sr[4][32];
71     static int _rsc;
72     _rsc = (_rsc+1) & 3;
73     if (v==ALL)
74         return "(ALL)";
75     else if (v==NONE)
76         return "(NONE)";
77     else
78         sprintf(_b64sr[_rsc],"(%i,%lli)",(int)layer(),offset());
79     return _b64sr[_rsc];
80 }