Ignore:
Timestamp:
02/15/18 00:43:07 (6 years ago)
Author:
Maciej Komosinski
Message:

Code formatting

File:
1 edited

Legend:

Unmodified
Added
Removed
  • cpp/frams/util/multirange.cpp

    r286 r733  
    1010int IRange::operator==(const IRange& r)
    1111{
    12 if (isEmpty()&&r.isEmpty()) return 1;
    13 return (begin==r.begin)&&(end==r.end);
     12        if (isEmpty() && r.isEmpty()) return 1;
     13        return (begin == r.begin) && (end == r.end);
    1414}
    1515
    1616void IRange::intersect(const IRange& r)
    1717{
    18 if (r.begin>begin) begin=r.begin;
    19 if (r.end<end) end=r.end;
     18        if (r.begin > begin) begin = r.begin;
     19        if (r.end < end) end = r.end;
    2020}
    2121void IRange::add(const IRange& r)
    2222{
    23 if (r.begin<begin) begin=r.begin;
    24 if (r.end>end) end=r.end;
     23        if (r.begin < begin) begin = r.begin;
     24        if (r.end > end) end = r.end;
    2525}
    2626
    2727void IRange::print() const
    2828{
    29 if (begin==end) printf("[%d]",begin);
    30 else printf("[%d-%d]",begin,end);
     29        if (begin == end) printf("[%d]", begin);
     30        else printf("[%d-%d]", begin, end);
    3131}
    3232
     
    3535void MultiRange::print() const
    3636{
    37 printf("[");
    38 for (int i=0;i<data.size();i+=2)
    39         {
    40         int b=getData(i);
    41         int e=getData(i+1);
    42         if (i) printf(",");
    43         if (b==e) printf("%d",b);
    44         else printf("%d-%d",b,e);
    45         }
    46 printf("]");
     37        printf("[");
     38        for (int i = 0; i < data.size(); i += 2)
     39        {
     40                int b = getData(i);
     41                int e = getData(i + 1);
     42                if (i) printf(",");
     43                if (b == e) printf("%d", b);
     44                else printf("%d-%d", b, e);
     45        }
     46        printf("]");
    4747}
    4848
    4949void MultiRange::print2() const
    5050{
    51 const IRange& r=singleRange();
    52 for(int i=0;i<=r.end;i++)
    53         printf(contains(i)?"X":".");
     51        const IRange& r = singleRange();
     52        for (int i = 0; i <= r.end; i++)
     53                printf(contains(i) ? "X" : ".");
    5454}
    5555
    5656void MultiRange::shift(int delta)
    5757{
    58 for(int i=0;i<data.size();i++)
    59         data.get(i)+=delta;
     58        for (int i = 0; i<data.size(); i++)
     59                data.get(i) += delta;
    6060}
    6161
    6262int MultiRange::findRange(int x) const
    6363{
    64 if (isEmpty()) return -1;
    65 if (getData(0)>x) return -1;
    66 int a,b,c;
    67 int n=rangeCount()-1;
    68 a=0; b=n; // find c = last range with begin<=x
    69 while(1){
    70         c=(a+b+1)/2;
    71         if (getBegin(c)<=x)
    72                 {
    73                 if ((c==n)||(getBegin(c+1)>x)) return c;
    74                 a=c;
    75                 }
    76         else
    77                 {
    78                 b=c-1;
    79                 }
    80         }
    81 }
    82 
    83 void MultiRange::addRange(int i,int b,int e)
    84 {
    85 data.insert(2*i,b);
    86 data.insert(2*i+1,e);
    87 }
    88 
    89 void MultiRange::removeRanges(int r1,int r2)
    90 {
    91 //data.remove(2*r1,(r2-r1)*2+2);
    92 for (;r2>=r1;r2--)
    93         removeRange(r2);
     64        if (isEmpty()) return -1;
     65        if (getData(0)>x) return -1;
     66        int a, b, c;
     67        int n = rangeCount() - 1;
     68        a = 0; b = n; // find c = last range with begin<=x
     69        while (1){
     70                c = (a + b + 1) / 2;
     71                if (getBegin(c) <= x)
     72                {
     73                        if ((c == n) || (getBegin(c + 1) > x)) return c;
     74                        a = c;
     75                }
     76                else
     77                {
     78                        b = c - 1;
     79                }
     80        }
     81}
     82
     83void MultiRange::addRange(int i, int b, int e)
     84{
     85        data.insert(2 * i, b);
     86        data.insert(2 * i + 1, e);
     87}
     88
     89void MultiRange::removeRanges(int r1, int r2)
     90{
     91        //data.remove(2*r1,(r2-r1)*2+2);
     92        for (; r2 >= r1; r2--)
     93                removeRange(r2);
    9494}
    9595
    9696void MultiRange::removeRange(int i)
    9797{
    98 data.remove(2*i,2);
     98        data.remove(2 * i, 2);
    9999}
    100100
    101101void MultiRange::clear()
    102 {data.clear();}
     102{
     103        data.clear();
     104}
    103105
    104106int MultiRange::isEmpty() const
    105107{
    106 return rangeCount()==0;
     108        return rangeCount() == 0;
    107109}
    108110
    109111IRange MultiRange::singleRange() const
    110112{
    111 if (isEmpty()) return IRange();
    112 int b=getData(0);
    113 int e=getData(data.size()-1);
    114 return IRange(b,e);
     113        if (isEmpty()) return IRange();
     114        int b = getData(0);
     115        int e = getData(data.size() - 1);
     116        return IRange(b, e);
    115117}
    116118
    117119int MultiRange::rangeCount() const
    118120{
    119 return data.size()/2;
     121        return data.size() / 2;
    120122}
    121123
    122124IRange MultiRange::getRange(int i) const
    123125{
    124 if ((i<0)||(i>=rangeCount())) return IRange();
    125 return IRange(getData(2*i),getData(2*i+1));
     126        if ((i < 0) || (i >= rangeCount())) return IRange();
     127        return IRange(getData(2 * i), getData(2 * i + 1));
    126128}
    127129
    128130void MultiRange::remove(int begin, int end)
    129131{
    130 if (end<begin) return; // NOP
    131 int count=rangeCount();
    132 if (!count) return;
    133 int r1=findRange(begin);
    134 int r2=findRange(end);
    135 if (r2<0) return; // NOP
    136 if (r1==r2)
    137         {
    138         int e=getEnd(r1);
    139         int b=getBegin(r1);
    140         if (begin<=e)
    141                 {
    142                 if (end>=e)
     132        if (end < begin) return; // NOP
     133        int count = rangeCount();
     134        if (!count) return;
     135        int r1 = findRange(begin);
     136        int r2 = findRange(end);
     137        if (r2<0) return; // NOP
     138        if (r1 == r2)
     139        {
     140                int e = getEnd(r1);
     141                int b = getBegin(r1);
     142                if (begin <= e)
     143                {
     144                        if (end >= e)
    143145                        {
    144                         if (begin>b)
    145                                 setEnd(r1,begin-1);
     146                                if (begin>b)
     147                                        setEnd(r1, begin - 1);
     148                                else
     149                                        removeRange(r1);
     150                        }
    146151                        else
    147                                 removeRange(r1);
    148                         }
    149                 else
    150152                        {
    151                         if (begin>b)
     153                                if (begin > b)
    152154                                { //split
    153                                 addRange(r1+1,end+1,e);
    154                                 setEnd(r1,begin-1);
     155                                        addRange(r1 + 1, end + 1, e);
     156                                        setEnd(r1, begin - 1);
    155157                                }
    156                         else
     158                                else
    157159                                {
    158                                 setBegin(r1,end+1);
     160                                        setBegin(r1, end + 1);
    159161                                }
    160162                        }
    161163                }
    162164        }
    163 else
    164         {
    165         if (r1>=0)
    166                 {
    167                 int e1=getEnd(r1);
    168                 int b1=getBegin(r1);
    169                 if (begin<=e1)
     165        else
     166        {
     167                if (r1 >= 0)
     168                {
     169                        int e1 = getEnd(r1);
     170                        int b1 = getBegin(r1);
     171                        if (begin <= e1)
    170172                        {
    171                         if (begin==b1)
     173                                if (begin == b1)
    172174                                {
    173                                 removeRange(r1);
    174                                 r2--;
    175                                 r1--;
     175                                        removeRange(r1);
     176                                        r2--;
     177                                        r1--;
    176178                                }
    177                         else
     179                                else
    178180                                {
    179                                 setEnd(r1,begin-1);
     181                                        setEnd(r1, begin - 1);
    180182                                }
    181183                        }
    182184                }
    183         int e2=getEnd(r2);
    184         if (end<e2)
    185                 {
    186                 setBegin(r2,end+1);
    187                 removeRanges(r1+1,r2-1);
    188                 }
    189         else
    190                 {
    191                 removeRanges(r1+1,r2);
     185                int e2 = getEnd(r2);
     186                if (end < e2)
     187                {
     188                        setBegin(r2, end + 1);
     189                        removeRanges(r1 + 1, r2 - 1);
     190                }
     191                else
     192                {
     193                        removeRanges(r1 + 1, r2);
    192194                }
    193195        }
     
    196198void MultiRange::add(int begin, int end)
    197199{
    198 if (end<begin) return; // NOP
    199 int count=rangeCount();
    200 int last=count-1;
    201 int r1=findRange(begin);
    202 int r2=findRange(end);
    203 if (r2<0) // special case: before first range
    204         {
    205         if (count&&(getData(0)==(end+1)))
    206                 setData(0,begin);
    207         else
    208                 addRange(0,begin,end);
    209         return;
    210         }
    211 if (r1<0) // special case: begin is before first range
    212         {
    213         setData(0,begin);
    214         r1=0;
    215         }
    216 // now r1>=0 and r2>=0
    217 int joinbegin=(begin<=(getEnd(r1)+1));
    218 int joinend=(r2<last)&&(end>=(getBegin(r2+1)-1));
    219 const int SAME=1;
    220 const int JOINBEGIN=2;
    221 const int JOINEND=4;
    222 int action=((r1==r2)?SAME:0)+(joinbegin?JOINBEGIN:0)+(joinend?JOINEND:0);
    223 switch(action)
    224         {
    225         case SAME+JOINBEGIN+JOINEND: // remove 1 range
    226                 setEnd(r1,getEnd(r1+1));
    227                 removeRange(r1+1);
    228                 break;
    229         case SAME+JOINBEGIN: // extend 1 range
    230                 setEnd(r1,max(getEnd(r2),end));
    231                 break;
    232         case SAME+JOINEND: // extend 1 range
    233                 setBegin(r1+1,begin);
     200        if (end < begin) return; // NOP
     201        int count = rangeCount();
     202        int last = count - 1;
     203        int r1 = findRange(begin);
     204        int r2 = findRange(end);
     205        if (r2 < 0) // special case: before first range
     206        {
     207                if (count && (getData(0) == (end + 1)))
     208                        setData(0, begin);
     209                else
     210                        addRange(0, begin, end);
     211                return;
     212        }
     213        if (r1 < 0) // special case: begin is before first range
     214        {
     215                setData(0, begin);
     216                r1 = 0;
     217        }
     218        // now r1>=0 and r2>=0
     219        int joinbegin = (begin <= (getEnd(r1) + 1));
     220        int joinend = (r2 < last) && (end >= (getBegin(r2 + 1) - 1));
     221        const int SAME = 1;
     222        const int JOINBEGIN = 2;
     223        const int JOINEND = 4;
     224        int action = ((r1 == r2) ? SAME : 0) + (joinbegin ? JOINBEGIN : 0) + (joinend ? JOINEND : 0);
     225        switch (action)
     226        {
     227        case SAME + JOINBEGIN + JOINEND: // remove 1 range
     228                setEnd(r1, getEnd(r1 + 1));
     229                removeRange(r1 + 1);
     230                break;
     231        case SAME + JOINBEGIN: // extend 1 range
     232                setEnd(r1, max(getEnd(r2), end));
     233                break;
     234        case SAME + JOINEND: // extend 1 range
     235                setBegin(r1 + 1, begin);
    234236                break;
    235237        case SAME: // add 1 range
    236                 addRange(r1+1,begin,end);
    237                 break;
    238 
    239         case JOINBEGIN+JOINEND: // extend r2+1
    240                 setBegin(r2+1,getBegin(r1));
    241                 removeRanges(r1,r2);
     238                addRange(r1 + 1, begin, end);
     239                break;
     240
     241        case JOINBEGIN + JOINEND: // extend r2+1
     242                setBegin(r2 + 1, getBegin(r1));
     243                removeRanges(r1, r2);
    242244                break;
    243245        case JOINBEGIN: // extend r1
    244                 setEnd(r1,max(end,getEnd(r2)));
    245                 removeRanges(r1+1,r2);
     246                setEnd(r1, max(end, getEnd(r2)));
     247                removeRanges(r1 + 1, r2);
    246248                break;
    247249        case JOINEND: // extend r2+1
    248                 setBegin(r2+1,begin);
    249                 removeRanges(r1+1,r2);
     250                setBegin(r2 + 1, begin);
     251                removeRanges(r1 + 1, r2);
    250252                break;
    251253        case 0: // extend r2
    252                 setBegin(r2,begin);
    253                 setEnd(r2,max(end,getEnd(r2)));
    254                 removeRanges(r1+1,r2-1);
     254                setBegin(r2, begin);
     255                setEnd(r2, max(end, getEnd(r2)));
     256                removeRanges(r1 + 1, r2 - 1);
    255257                break;
    256258        }
     
    259261void MultiRange::remove(const MultiRange &mr)
    260262{
    261 for(int i=0;i<mr.rangeCount();i++)
    262         {
    263         IRange r=mr.getRange(i);
    264         remove(r);
     263        for (int i = 0; i < mr.rangeCount(); i++)
     264        {
     265                IRange r = mr.getRange(i);
     266                remove(r);
    265267        }
    266268}
     
    268270void MultiRange::add(const MultiRange &mr)
    269271{
    270 for(int i=0;i<mr.rangeCount();i++)
    271         {
    272         IRange r=mr.getRange(i);
    273         add(r);
     272        for (int i = 0; i < mr.rangeCount(); i++)
     273        {
     274                IRange r = mr.getRange(i);
     275                add(r);
    274276        }
    275277}
     
    277279void MultiRange::intersect(const MultiRange &mr)
    278280{
    279 // = this - (1-mr)
    280 MultiRange full(singleRange());
    281 full.remove(mr);
    282 remove(full);
     281        // = this - (1-mr)
     282        MultiRange full(singleRange());
     283        full.remove(mr);
     284        remove(full);
    283285}
    284286
    285287int MultiRange::contains(const MultiRange &mr) const
    286288{
    287 for(int i=0;i<mr.rangeCount();i++)
    288         {
    289         IRange r=mr.getRange(i);
    290         if (!contains(r)) return 0;
    291         }
    292 return 1;
     289        for (int i = 0; i < mr.rangeCount(); i++)
     290        {
     291                IRange r = mr.getRange(i);
     292                if (!contains(r)) return 0;
     293        }
     294        return 1;
    293295}
    294296
    295297int MultiRange::contains(int x) const
    296298{
    297 int r=findRange(x);
    298 if (r<0) return 0;
    299 return getEnd(r)>=x;
     299        int r = findRange(x);
     300        if (r < 0) return 0;
     301        return getEnd(r) >= x;
    300302}
    301303
    302304int MultiRange::contains(const IRange& r) const
    303305{
    304 if (r.isEmpty()) return 0;
    305 int r1=findRange(r.begin);
    306 if (r1<0) return 0;
    307 return getRange(r1).contains(r);
     306        if (r.isEmpty()) return 0;
     307        int r1 = findRange(r.begin);
     308        if (r1 < 0) return 0;
     309        return getRange(r1).contains(r);
    308310}
    309311
    310312void MultiRange::intersect(int begin, int end)
    311313{
    312 if (isEmpty()) return;
    313 if (end<begin) {clear(); return;}
    314 IRange sr=singleRange();
    315 remove(sr.begin, begin-1);
    316 remove(end+1, sr.end);
    317 }
     314        if (isEmpty()) return;
     315        if (end < begin) { clear(); return; }
     316        IRange sr = singleRange();
     317        remove(sr.begin, begin - 1);
     318        remove(end + 1, sr.end);
     319}
Note: See TracChangeset for help on using the changeset viewer.