Deleted Added
full compact
PackedVector.h (225736) PackedVector.h (245431)
1//===- llvm/ADT/PackedVector.h - Packed values vector -----------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//

--- 5 unchanged lines hidden (view full) ---

14#ifndef LLVM_ADT_PACKEDVECTOR_H
15#define LLVM_ADT_PACKEDVECTOR_H
16
17#include "llvm/ADT/BitVector.h"
18#include <limits>
19
20namespace llvm {
21
1//===- llvm/ADT/PackedVector.h - Packed values vector -----------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//

--- 5 unchanged lines hidden (view full) ---

14#ifndef LLVM_ADT_PACKEDVECTOR_H
15#define LLVM_ADT_PACKEDVECTOR_H
16
17#include "llvm/ADT/BitVector.h"
18#include <limits>
19
20namespace llvm {
21
22template
22template <typename T, unsigned BitNum, typename BitVectorTy, bool isSigned>
23class PackedVectorBase;
24
25// This won't be necessary if we can specialize members without specializing
26// the parent template.
23class PackedVectorBase;
24
25// This won't be necessary if we can specialize members without specializing
26// the parent template.
27template
28class PackedVectorBase {
27template <typename T, unsigned BitNum, typename BitVectorTy>
28class PackedVectorBase<T, BitNum, BitVectorTy, false> {
29protected:
29protected:
30 static T getValue(const llvm::BitVector &Bits, unsigned Idx) {
30 static T getValue(const BitVectorTy &Bits, unsigned Idx) {
31 T val = T();
32 for (unsigned i = 0; i != BitNum; ++i)
33 val = T(val | ((Bits[(Idx << (BitNum-1)) + i] ? 1UL : 0UL) << i));
34 return val;
35 }
36
31 T val = T();
32 for (unsigned i = 0; i != BitNum; ++i)
33 val = T(val | ((Bits[(Idx << (BitNum-1)) + i] ? 1UL : 0UL) << i));
34 return val;
35 }
36
37 static void setValue(llvm::BitVector &Bits, unsigned Idx, T val) {
37 static void setValue(BitVectorTy &Bits, unsigned Idx, T val) {
38 assert((val >> BitNum) == 0 && "value is too big");
39 for (unsigned i = 0; i != BitNum; ++i)
40 Bits[(Idx << (BitNum-1)) + i] = val & (T(1) << i);
41 }
42};
43
38 assert((val >> BitNum) == 0 && "value is too big");
39 for (unsigned i = 0; i != BitNum; ++i)
40 Bits[(Idx << (BitNum-1)) + i] = val & (T(1) << i);
41 }
42};
43
44template
45class PackedVectorBase {
44template <typename T, unsigned BitNum, typename BitVectorTy>
45class PackedVectorBase<T, BitNum, BitVectorTy, true> {
46protected:
46protected:
47 static T getValue(const llvm::BitVector &Bits, unsigned Idx) {
47 static T getValue(const BitVectorTy &Bits, unsigned Idx) {
48 T val = T();
49 for (unsigned i = 0; i != BitNum-1; ++i)
50 val = T(val | ((Bits[(Idx << (BitNum-1)) + i] ? 1UL : 0UL) << i));
51 if (Bits[(Idx << (BitNum-1)) + BitNum-1])
52 val = ~val;
53 return val;
54 }
55
48 T val = T();
49 for (unsigned i = 0; i != BitNum-1; ++i)
50 val = T(val | ((Bits[(Idx << (BitNum-1)) + i] ? 1UL : 0UL) << i));
51 if (Bits[(Idx << (BitNum-1)) + BitNum-1])
52 val = ~val;
53 return val;
54 }
55
56 static void setValue(llvm::BitVector &Bits, unsigned Idx, T val) {
56 static void setValue(BitVectorTy &Bits, unsigned Idx, T val) {
57 if (val < 0) {
58 val = ~val;
59 Bits.set((Idx << (BitNum-1)) + BitNum-1);
60 }
61 assert((val >> (BitNum-1)) == 0 && "value is too big");
62 for (unsigned i = 0; i != BitNum-1; ++i)
63 Bits[(Idx << (BitNum-1)) + i] = val & (T(1) << i);
64 }
65};
66
67/// \brief Store a vector of values using a specific number of bits for each
68/// value. Both signed and unsigned types can be used, e.g
69/// @code
70/// PackedVector<signed, 2> vec;
71/// @endcode
72/// will create a vector accepting values -2, -1, 0, 1. Any other value will hit
73/// an assertion.
57 if (val < 0) {
58 val = ~val;
59 Bits.set((Idx << (BitNum-1)) + BitNum-1);
60 }
61 assert((val >> (BitNum-1)) == 0 && "value is too big");
62 for (unsigned i = 0; i != BitNum-1; ++i)
63 Bits[(Idx << (BitNum-1)) + i] = val & (T(1) << i);
64 }
65};
66
67/// \brief Store a vector of values using a specific number of bits for each
68/// value. Both signed and unsigned types can be used, e.g
69/// @code
70/// PackedVector<signed, 2> vec;
71/// @endcode
72/// will create a vector accepting values -2, -1, 0, 1. Any other value will hit
73/// an assertion.
74template
75class PackedVector : public PackedVectorBase
74template <typename T, unsigned BitNum, typename BitVectorTy = BitVector>
75class PackedVector : public PackedVectorBase<T, BitNum, BitVectorTy,
76 std::numeric_limits<T>::is_signed> {
76 std::numeric_limits<T>::is_signed> {
77 llvm::BitVector Bits;
78 typedef PackedVectorBase<T, BitNum, std::numeric_limits<T>::is_signed> base;
77 BitVectorTy Bits;
78 typedef PackedVectorBase<T, BitNum, BitVectorTy,
79 std::numeric_limits<T>::is_signed> base;
79
80public:
81 class reference {
82 PackedVector &Vec;
83 const unsigned Idx;
84
85 reference(); // Undefined
86 public:

--- 72 unchanged lines hidden ---
80
81public:
82 class reference {
83 PackedVector &Vec;
84 const unsigned Idx;
85
86 reference(); // Undefined
87 public:

--- 72 unchanged lines hidden ---