9
9
#ifndef LLVM_CODEGEN_PBQP_MATH_H
10
10
#define LLVM_CODEGEN_PBQP_MATH_H
11
11
12
+ #include " llvm/ADT/ArrayRef.h"
12
13
#include " llvm/ADT/Hashing.h"
13
14
#include " llvm/ADT/STLExtras.h"
14
15
#include " llvm/Support/InterleavedRange.h"
@@ -28,83 +29,74 @@ class Vector {
28
29
29
30
public:
30
31
// / Construct a PBQP vector of the given size.
31
- explicit Vector (unsigned Length)
32
- : Length(Length), Data(std::make_unique<PBQPNum []>(Length)) {}
32
+ explicit Vector (unsigned Length) : Data(Length) {}
33
33
34
34
// / Construct a PBQP vector with initializer.
35
- Vector (unsigned Length, PBQPNum InitVal)
36
- : Length(Length), Data(std::make_unique<PBQPNum []>(Length)) {
35
+ Vector (unsigned Length, PBQPNum InitVal) : Data(Length) {
37
36
std::fill (begin (), end (), InitVal);
38
37
}
39
38
40
39
// / Copy construct a PBQP vector.
41
- Vector (const Vector &V)
42
- : Length(V.Length), Data(std::make_unique<PBQPNum []>(Length)) {
43
- llvm::copy (V, begin ());
44
- }
40
+ Vector (const Vector &V) : Data(ArrayRef<PBQPNum>(V.Data)) {}
45
41
46
42
// / Move construct a PBQP vector.
47
- Vector (Vector &&V)
48
- : Length(V.Length), Data(std::move(V.Data)) {
49
- V.Length = 0 ;
50
- }
43
+ Vector (Vector &&V) : Data(std::move(V.Data)) {}
51
44
52
45
// Iterator-based access.
53
- const PBQPNum *begin () const { return Data.get (); }
54
- const PBQPNum *end () const { return Data.get () + Length ; }
55
- PBQPNum *begin () { return Data.get (); }
56
- PBQPNum *end () { return Data.get () + Length ; }
46
+ const PBQPNum *begin () const { return Data.begin (); }
47
+ const PBQPNum *end () const { return Data.end () ; }
48
+ PBQPNum *begin () { return Data.begin (); }
49
+ PBQPNum *end () { return Data.end () ; }
57
50
58
51
// / Comparison operator.
59
52
bool operator ==(const Vector &V) const {
60
- assert (Length != 0 && Data && " Invalid vector" );
53
+ assert (! Data. empty () && " Invalid vector" );
61
54
return llvm::equal (*this , V);
62
55
}
63
56
64
57
// / Return the length of the vector
65
58
unsigned getLength () const {
66
- assert (Length != 0 && Data && " Invalid vector" );
67
- return Length ;
59
+ assert (! Data. empty () && " Invalid vector" );
60
+ return Data. size () ;
68
61
}
69
62
70
63
// / Element access.
71
64
PBQPNum& operator [](unsigned Index) {
72
- assert (Length != 0 && Data && " Invalid vector" );
73
- assert (Index < Length && " Vector element access out of bounds." );
65
+ assert (! Data. empty () && " Invalid vector" );
66
+ assert (Index < Data. size () && " Vector element access out of bounds." );
74
67
return Data[Index];
75
68
}
76
69
77
70
// / Const element access.
78
71
const PBQPNum& operator [](unsigned Index) const {
79
- assert (Length != 0 && Data && " Invalid vector" );
80
- assert (Index < Length && " Vector element access out of bounds." );
72
+ assert (! Data. empty () && " Invalid vector" );
73
+ assert (Index < Data. size () && " Vector element access out of bounds." );
81
74
return Data[Index];
82
75
}
83
76
84
77
// / Add another vector to this one.
85
78
Vector& operator +=(const Vector &V) {
86
- assert (Length != 0 && Data && " Invalid vector" );
87
- assert (Length == V.Length && " Vector length mismatch." );
79
+ assert (! Data. empty () && " Invalid vector" );
80
+ assert (Data. size () == V.Data . size () && " Vector length mismatch." );
88
81
std::transform (begin (), end (), V.begin (), begin (), std::plus<PBQPNum>());
89
82
return *this ;
90
83
}
91
84
92
85
// / Returns the index of the minimum value in this vector
93
86
unsigned minIndex () const {
94
- assert (Length != 0 && Data && " Invalid vector" );
87
+ assert (! Data. empty () && " Invalid vector" );
95
88
return llvm::min_element (*this ) - begin ();
96
89
}
97
90
98
91
private:
99
- unsigned Length;
100
- std::unique_ptr<PBQPNum []> Data;
92
+ OwningArrayRef<PBQPNum> Data;
101
93
};
102
94
103
95
// / Return a hash_value for the given vector.
104
96
inline hash_code hash_value (const Vector &V) {
105
97
const unsigned *VBegin = reinterpret_cast <const unsigned *>(V.begin ());
106
98
const unsigned *VEnd = reinterpret_cast <const unsigned *>(V.end ());
107
- return hash_combine (V.Length , hash_combine_range (VBegin, VEnd));
99
+ return hash_combine (V.Data . size () , hash_combine_range (VBegin, VEnd));
108
100
}
109
101
110
102
// / Output a textual representation of the given vector on the given
0 commit comments