| // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file | 
 | // for details. All rights reserved. Use of this source code is governed by a | 
 | // BSD-style license that can be found in the LICENSE file. | 
 |  | 
 | #include "vm/bit_vector.h" | 
 | #include "platform/assert.h" | 
 | #include "vm/unit_test.h" | 
 |  | 
 | namespace dart { | 
 |  | 
 | #define Z (thread->zone()) | 
 |  | 
 | TEST_CASE(BitVector) { | 
 |   { | 
 |     BitVector* v = new BitVector(Z, 15); | 
 |     v->Add(1); | 
 |     EXPECT_EQ(true, v->Contains(1)); | 
 |     EXPECT_EQ(false, v->Contains(0)); | 
 |     { | 
 |       BitVector::Iterator iter(v); | 
 |       EXPECT_EQ(1, iter.Current()); | 
 |       iter.Advance(); | 
 |       EXPECT(iter.Done()); | 
 |     } | 
 |     v->Add(0); | 
 |     v->Add(1); | 
 |     EXPECT_EQ(true, v->Contains(0)); | 
 |     EXPECT_EQ(true, v->Contains(1)); | 
 |     { | 
 |       BitVector::Iterator iter(v); | 
 |       EXPECT_EQ(0, iter.Current()); | 
 |       iter.Advance(); | 
 |       EXPECT_EQ(1, iter.Current()); | 
 |       iter.Advance(); | 
 |       EXPECT(iter.Done()); | 
 |     } | 
 |   } | 
 |  | 
 |   { | 
 |     BitVector* v = new BitVector(Z, 128); | 
 |     v->Add(49); | 
 |     v->Add(62); | 
 |     v->Add(63); | 
 |     v->Add(65); | 
 |     EXPECT_EQ(true, v->Contains(49)); | 
 |     EXPECT_EQ(true, v->Contains(62)); | 
 |     EXPECT_EQ(true, v->Contains(63)); | 
 |     EXPECT_EQ(true, v->Contains(65)); | 
 |     EXPECT_EQ(false, v->Contains(64)); | 
 |     BitVector::Iterator iter(v); | 
 |     EXPECT_EQ(49, iter.Current()); | 
 |     iter.Advance(); | 
 |     EXPECT_EQ(62, iter.Current()); | 
 |     iter.Advance(); | 
 |     EXPECT_EQ(63, iter.Current()); | 
 |     iter.Advance(); | 
 |     EXPECT_EQ(65, iter.Current()); | 
 |     iter.Advance(); | 
 |     EXPECT(iter.Done()); | 
 |   } | 
 |  | 
 |   { | 
 |     BitVector* a = new BitVector(Z, 128); | 
 |     BitVector* b = new BitVector(Z, 128); | 
 |     BitVector* c = new BitVector(Z, 128); | 
 |     b->Add(0); | 
 |     b->Add(32); | 
 |     b->Add(64); | 
 |     a->AddAll(b); | 
 |     EXPECT_EQ(true, a->Contains(0)); | 
 |     EXPECT_EQ(true, a->Contains(32)); | 
 |     EXPECT_EQ(true, a->Contains(64)); | 
 |     EXPECT_EQ(false, a->Contains(96)); | 
 |     EXPECT_EQ(false, a->Contains(127)); | 
 |     b->Add(96); | 
 |     b->Add(127); | 
 |     c->Add(127); | 
 |     a->KillAndAdd(c, b); | 
 |     EXPECT_EQ(true, a->Contains(0)); | 
 |     EXPECT_EQ(true, a->Contains(32)); | 
 |     EXPECT_EQ(true, a->Contains(64)); | 
 |     EXPECT_EQ(true, a->Contains(96)); | 
 |     EXPECT_EQ(false, a->Contains(127)); | 
 |     a->Remove(0); | 
 |     a->Remove(32); | 
 |     a->Remove(64); | 
 |     a->Remove(96); | 
 |     EXPECT_EQ(false, a->Contains(0)); | 
 |     EXPECT_EQ(false, a->Contains(32)); | 
 |     EXPECT_EQ(false, a->Contains(64)); | 
 |     EXPECT_EQ(false, a->Contains(96)); | 
 |   } | 
 |  | 
 |   { | 
 |     BitVector* a = new BitVector(Z, 34); | 
 |     BitVector* b = new BitVector(Z, 34); | 
 |     a->SetAll(); | 
 |     b->Add(0); | 
 |     b->Add(1); | 
 |     b->Add(31); | 
 |     b->Add(32); | 
 |     a->Intersect(b); | 
 |     EXPECT_EQ(true, a->Equals(*b)); | 
 |   } | 
 |  | 
 |   { | 
 |     BitVector* a = new BitVector(Z, 2); | 
 |     BitVector* b = new BitVector(Z, 2); | 
 |     a->SetAll(); | 
 |     a->Remove(0); | 
 |     a->Remove(1); | 
 |     EXPECT_EQ(true, a->Equals(*b)); | 
 |   } | 
 |  | 
 |   { | 
 |     BitVector* a = new BitVector(Z, 128); | 
 |     BitVector* b = new BitVector(Z, 128); | 
 |     b->Add(0); | 
 |     b->Add(32); | 
 |     b->Add(64); | 
 |     a->Add(0); | 
 |     a->Add(64); | 
 |     b->RemoveAll(a); | 
 |     EXPECT_EQ(false, b->Contains(0)); | 
 |     EXPECT_EQ(true, b->Contains(32)); | 
 |     EXPECT_EQ(false, b->Contains(64)); | 
 |   } | 
 | } | 
 |  | 
 | }  // namespace dart |