Skip to content

Commit 7c390fa

Browse files
jchodorCompute-Runtime-Automation
authored andcommitted
New helpers is utilities_containers
Change-Id: Ibb653c89a556c3bb32ce891e786719f70b56431f
1 parent 08f80d1 commit 7c390fa

File tree

3 files changed

+130
-13
lines changed

3 files changed

+130
-13
lines changed

runtime/utilities/range.h

Lines changed: 60 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,83 @@
11
/*
2-
* Copyright (C) 2017-2018 Intel Corporation
2+
* Copyright (C) 2017-2019 Intel Corporation
33
*
44
* SPDX-License-Identifier: MIT
55
*
66
*/
77

88
#pragma once
99

10+
#include <iterator>
11+
1012
namespace OCLRT {
1113

12-
template <typename T>
14+
template <typename DataType>
1315
struct Range {
14-
Range(T *base, size_t count)
15-
: Beg(base), End(base + count) {
16+
using iterator = DataType *;
17+
using const_iterator = const DataType *;
18+
using reverse_iterator = std::reverse_iterator<iterator>;
19+
using const_reverse_iterator = std::reverse_iterator<const_iterator>;
20+
21+
Range(DataType *base, size_t count)
22+
: begIt(base), endIt(base + count) {
23+
}
24+
25+
template <typename SequentialContainerT, typename BeginT = decltype(((SequentialContainerT *)nullptr)->size())>
26+
Range(SequentialContainerT &container)
27+
: Range(&*container.begin(), container.size()) {
28+
}
29+
30+
template <typename T, size_t S>
31+
Range(T (&base)[S])
32+
: Range(&base[0], S) {
33+
}
34+
35+
iterator begin() {
36+
return begIt;
37+
}
38+
39+
iterator end() {
40+
return endIt;
41+
}
42+
43+
const_iterator begin() const {
44+
return begIt;
45+
}
46+
47+
const_iterator end() const {
48+
return endIt;
49+
}
50+
51+
reverse_iterator rbegin() {
52+
return reverse_iterator(end());
53+
}
54+
55+
const_reverse_iterator rbegin() const {
56+
return const_reverse_iterator(end());
57+
}
58+
59+
reverse_iterator rend() {
60+
return reverse_iterator(end()) + (endIt - begIt);
61+
}
62+
63+
const_reverse_iterator rend() const {
64+
return const_reverse_iterator(end()) + (endIt - begIt);
1665
}
1766

18-
T *begin() {
19-
return Beg;
67+
bool empty() const {
68+
return begIt == endIt;
2069
}
2170

22-
T *end() {
23-
return End;
71+
size_t size() const {
72+
return endIt - begIt;
2473
}
2574

26-
T *Beg;
27-
T *End;
75+
iterator begIt;
76+
iterator endIt;
2877
};
2978

3079
template <typename T>
31-
Range<T> CreateRange(T *base, size_t count) {
80+
inline Range<T> CreateRange(T *base, size_t count) {
3281
return Range<T>(base, count);
3382
}
3483
} // namespace OCLRT

runtime/utilities/stackvec.h

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2018 Intel Corporation
2+
* Copyright (C) 2018-2019 Intel Corporation
33
*
44
* SPDX-License-Identifier: MIT
55
*
@@ -11,6 +11,7 @@
1111

1212
#include <cinttypes>
1313
#include <cstddef>
14+
#include <iterator>
1415
#include <vector>
1516

1617
template <typename DataType, size_t OnStackCapacity>
@@ -58,6 +59,13 @@ class StackVec {
5859
resize(initialSize);
5960
}
6061

62+
StackVec(std::initializer_list<DataType> init) {
63+
reserve(init.size());
64+
for (const auto &obj : init) {
65+
push_back(obj);
66+
}
67+
}
68+
6169
StackVec &operator=(const StackVec &rhs) {
6270
clear();
6371

@@ -321,3 +329,9 @@ bool operator==(const StackVec<T, LhsStackCaps> &lhs,
321329

322330
return true;
323331
}
332+
333+
template <typename T, size_t LhsStackCaps, size_t RhsStackCaps>
334+
bool operator!=(const StackVec<T, LhsStackCaps> &lhs,
335+
const StackVec<T, RhsStackCaps> &rhs) {
336+
return false == (lhs == rhs);
337+
}

unit_tests/utilities/containers_tests.cpp

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2018 Intel Corporation
2+
* Copyright (C) 2018-2019 Intel Corporation
33
*
44
* SPDX-License-Identifier: MIT
55
*
@@ -8,6 +8,7 @@
88
#include "runtime/utilities/arrayref.h"
99
#include "runtime/utilities/idlist.h"
1010
#include "runtime/utilities/iflist.h"
11+
#include "runtime/utilities/range.h"
1112
#include "runtime/utilities/stackvec.h"
1213
#include "unit_tests/utilities/containers_tests_helpers.h"
1314

@@ -1069,6 +1070,12 @@ TEST(StackVec, Constructor) {
10691070
ASSERT_TRUE(contains(&bigger, &*bigger.begin()));
10701071
ASSERT_TRUE(contains(&exact, &*exact.begin()));
10711072
ASSERT_FALSE(contains(&smaller, &*smaller.begin()));
1073+
1074+
StackVec<Type, 4> withInitList{1, 2, 3, 5};
1075+
EXPECT_EQ(1, withInitList[0]);
1076+
EXPECT_EQ(2, withInitList[1]);
1077+
EXPECT_EQ(3, withInitList[2]);
1078+
EXPECT_EQ(5, withInitList[3]);
10721079
}
10731080

10741081
TEST(StackVec, ConstructorWithInitialSizeGetsResizedAutomaticallyDuringConstruction) {
@@ -1499,6 +1506,8 @@ TEST(StackVec, EqualsOperatorReturnsFalseIfStackVecsHaveDifferentSizes) {
14991506

15001507
EXPECT_FALSE(longer == shorter);
15011508
EXPECT_FALSE(shorter == longer);
1509+
EXPECT_TRUE(longer != shorter);
1510+
EXPECT_TRUE(shorter != longer);
15021511
}
15031512

15041513
TEST(StackVec, EqualsOperatorReturnsFalseIfDataNotEqual) {
@@ -1508,13 +1517,15 @@ TEST(StackVec, EqualsOperatorReturnsFalseIfDataNotEqual) {
15081517
StackVec<char, 10> vecA{dataA, dataA + sizeof(dataA)};
15091518
StackVec<char, 15> vecB{dataB, dataB + sizeof(dataB)};
15101519
EXPECT_FALSE(vecA == vecB);
1520+
EXPECT_TRUE(vecA != vecB);
15111521
}
15121522

15131523
TEST(StackVec, EqualsOperatorReturnsTrueIfBothContainersAreEmpty) {
15141524
StackVec<char, 10> vecA;
15151525
StackVec<char, 15> vecB;
15161526

15171527
EXPECT_TRUE(vecA == vecB);
1528+
EXPECT_FALSE(vecA != vecB);
15181529
}
15191530

15201531
TEST(StackVec, EqualsOperatorReturnsTrueIfDataIsEqual) {
@@ -1524,6 +1535,7 @@ TEST(StackVec, EqualsOperatorReturnsTrueIfDataIsEqual) {
15241535
StackVec<char, 10> vecA{dataA, dataA + sizeof(dataA)};
15251536
StackVec<char, 15> vecB{dataB, dataB + sizeof(dataB)};
15261537
EXPECT_TRUE(vecA == vecB);
1538+
EXPECT_FALSE(vecA != vecB);
15271539
}
15281540

15291541
int sum(ArrayRef<int> a) {
@@ -1638,3 +1650,45 @@ TEST(ArrayRef, EqualsOperatorReturnsTrueIfDataIsEqual) {
16381650
ArrayRef<char> arrayB{dataB, sizeof(dataB)};
16391651
EXPECT_TRUE(arrayA == arrayB);
16401652
}
1653+
1654+
TEST(Range, GivenRangeThenValidStandardIteratorsAreAvailable) {
1655+
int tab[10] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29};
1656+
Range<int> range = tab;
1657+
const Range<int> &constantRange = range;
1658+
Range<int> emptyRange{nullptr, 0};
1659+
EXPECT_EQ(0U, emptyRange.size());
1660+
EXPECT_TRUE(emptyRange.empty());
1661+
EXPECT_EQ(10U, constantRange.size());
1662+
EXPECT_FALSE(constantRange.empty());
1663+
1664+
auto rangeFwdIt = range.begin();
1665+
auto rangeFwdEnd = range.end();
1666+
auto rangeBackIt = range.rbegin();
1667+
auto rangeBackEnd = range.rend();
1668+
1669+
auto constantRangeFwdIt = constantRange.begin();
1670+
auto constantRangeFwdEnd = constantRange.end();
1671+
auto constantRangeBackIt = constantRange.rbegin();
1672+
auto constantRangeBackEnd = constantRange.rend();
1673+
for (int i = 0; i < 10; ++i, ++rangeFwdIt, ++rangeBackIt, ++constantRangeFwdIt, ++constantRangeBackIt) {
1674+
EXPECT_EQ(tab[i], *rangeFwdIt) << " it : " << i;
1675+
EXPECT_EQ(tab[i], *constantRangeFwdIt) << " it : " << i;
1676+
EXPECT_NE(rangeFwdEnd, rangeFwdIt) << " it : " << i;
1677+
EXPECT_NE(constantRangeFwdEnd, constantRangeFwdIt) << " it : " << i;
1678+
1679+
EXPECT_EQ(tab[10 - 1 - i], *rangeBackIt) << " it : " << i;
1680+
EXPECT_EQ(tab[10 - 1 - i], *constantRangeBackIt) << " it : " << i;
1681+
EXPECT_NE(rangeBackEnd, rangeBackIt) << " it : " << i;
1682+
EXPECT_NE(constantRangeBackEnd, constantRangeBackIt) << " it : " << i;
1683+
}
1684+
1685+
EXPECT_EQ(rangeFwdEnd, rangeFwdIt);
1686+
EXPECT_EQ(constantRangeFwdEnd, constantRangeFwdIt);
1687+
EXPECT_EQ(rangeBackEnd, rangeBackIt);
1688+
EXPECT_EQ(constantRangeBackEnd, constantRangeBackIt);
1689+
1690+
std::vector<int> vec(&tab[0], &tab[10]);
1691+
Range<int> rangeFromVec = vec;
1692+
EXPECT_EQ(&*vec.begin(), &*rangeFromVec.begin());
1693+
EXPECT_EQ(&*vec.rbegin(), &*rangeFromVec.rbegin());
1694+
}

0 commit comments

Comments
 (0)