Create a typedef for HInstruction::GetInputs() return type.
And some other cleanup after
https://android-review.googlesource.com/230742
Test: No new tests. ART test suite passed (tested on host).
Change-Id: I4743bf17544d0234c6ccb46dd0c1b9aae5c93e17
diff --git a/compiler/utils/transform_array_ref.h b/compiler/utils/transform_array_ref.h
index 6297b88..a6da34f 100644
--- a/compiler/utils/transform_array_ref.h
+++ b/compiler/utils/transform_array_ref.h
@@ -70,6 +70,11 @@
TransformArrayRef(const ArrayRef<OtherBT>& base, Function fn)
: data_(base, fn) { }
+ template <typename OtherBT,
+ typename = typename std::enable_if<std::is_same<BaseType, const OtherBT>::value>::type>
+ TransformArrayRef(const TransformArrayRef<OtherBT, Function>& other)
+ : TransformArrayRef(other.base(), other.GetFunction()) { }
+
// Assignment operators.
TransformArrayRef& operator=(const TransformArrayRef& other) = default;
@@ -149,6 +154,9 @@
}
Data data_;
+
+ template <typename OtherBT, typename OtherFunction>
+ friend class TransformArrayRef;
};
template <typename BaseType, typename Function>
diff --git a/compiler/utils/transform_array_ref_test.cc b/compiler/utils/transform_array_ref_test.cc
index 2593fad..8d71fd7 100644
--- a/compiler/utils/transform_array_ref_test.cc
+++ b/compiler/utils/transform_array_ref_test.cc
@@ -160,6 +160,48 @@
taref[i] = transform_input[i];
}
ASSERT_EQ(std::vector<ValueHolder>({ 24, 37, 11, 71 }), transformed);
+
+ const std::vector<ValueHolder>& cinput = input;
+
+ auto ctaref = MakeTransformArrayRef(cinput, ref);
+ static_assert(std::is_same<int, decltype(ctaref)::value_type>::value, "value_type");
+ static_assert(std::is_same<const int*, decltype(ctaref)::pointer>::value, "pointer");
+ static_assert(std::is_same<const int&, decltype(ctaref)::reference>::value, "reference");
+ static_assert(std::is_same<const int*, decltype(ctaref)::const_pointer>::value, "const_pointer");
+ static_assert(std::is_same<const int&, decltype(ctaref)::const_reference>::value,
+ "const_reference");
+
+ std::copy(ctaref.begin(), ctaref.end(), std::back_inserter(output));
+ ASSERT_EQ(std::vector<int>({ 1, 0, 1, 0, 3, 1 }), output);
+ output.clear();
+
+ std::copy(ctaref.cbegin(), ctaref.cend(), std::back_inserter(output));
+ ASSERT_EQ(std::vector<int>({ 1, 0, 1, 0, 3, 1 }), output);
+ output.clear();
+
+ std::copy(ctaref.rbegin(), ctaref.rend(), std::back_inserter(output));
+ ASSERT_EQ(std::vector<int>({ 1, 3, 0, 1, 0, 1 }), output);
+ output.clear();
+
+ std::copy(ctaref.crbegin(), ctaref.crend(), std::back_inserter(output));
+ ASSERT_EQ(std::vector<int>({ 1, 3, 0, 1, 0, 1 }), output);
+ output.clear();
+
+ ASSERT_EQ(cinput.size(), ctaref.size());
+ ASSERT_EQ(cinput.empty(), ctaref.empty());
+ ASSERT_EQ(cinput.front().value, ctaref.front());
+ ASSERT_EQ(cinput.back().value, ctaref.back());
+
+ for (size_t i = 0; i != cinput.size(); ++i) {
+ ASSERT_EQ(cinput[i].value, ctaref[i]);
+ }
+
+ // Test conversion adding const.
+ decltype(ctaref) ctaref2 = taref;
+ ASSERT_EQ(taref.size(), ctaref2.size());
+ for (size_t i = 0; i != taref.size(); ++i) {
+ ASSERT_EQ(taref[i], ctaref2[i]);
+ }
}
} // namespace art
diff --git a/compiler/utils/transform_iterator.h b/compiler/utils/transform_iterator.h
index f0769d4..3bc9046 100644
--- a/compiler/utils/transform_iterator.h
+++ b/compiler/utils/transform_iterator.h
@@ -44,11 +44,7 @@
typename std::iterator_traits<BaseIterator>::iterator_category>::value,
"Transform iterator base must be an input iterator.");
- using InputType =
- typename std::conditional<
- std::is_same<void, typename std::iterator_traits<BaseIterator>::reference>::value,
- typename std::iterator_traits<BaseIterator>::value_type,
- typename std::iterator_traits<BaseIterator>::reference>::type;
+ using InputType = typename std::iterator_traits<BaseIterator>::reference;
using ResultType = typename std::result_of<Function(InputType)>::type;
public:
diff --git a/compiler/utils/transform_iterator_test.cc b/compiler/utils/transform_iterator_test.cc
index dbb4779..57ff0a6 100644
--- a/compiler/utils/transform_iterator_test.cc
+++ b/compiler/utils/transform_iterator_test.cc
@@ -20,8 +20,6 @@
#include <type_traits>
#include <vector>
-#include <array>
-
#include "gtest/gtest.h"
#include "utils/transform_iterator.h"