Simplifies the definition of NativeArray. Works around a VC bug in StrictMock & NiceMock.

This commit is contained in:
zhanyong.wan
2009-09-16 17:38:08 +00:00
parent f5e1ce5b92
commit 4bd79e4f25
6 changed files with 117 additions and 81 deletions

View File

@@ -70,42 +70,49 @@ class NiceMock : public MockClass {
// We don't factor out the constructor body to a common method, as
// we have to avoid a possible clash with members of MockClass.
NiceMock() {
Mock::AllowUninterestingCalls(internal::implicit_cast<MockClass*>(this));
::testing::Mock::AllowUninterestingCalls(
internal::implicit_cast<MockClass*>(this));
}
// C++ doesn't (yet) allow inheritance of constructors, so we have
// to define it for each arity.
template <typename A1>
explicit NiceMock(const A1& a1) : MockClass(a1) {
Mock::AllowUninterestingCalls(internal::implicit_cast<MockClass*>(this));
::testing::Mock::AllowUninterestingCalls(
internal::implicit_cast<MockClass*>(this));
}
template <typename A1, typename A2>
NiceMock(const A1& a1, const A2& a2) : MockClass(a1, a2) {
Mock::AllowUninterestingCalls(internal::implicit_cast<MockClass*>(this));
::testing::Mock::AllowUninterestingCalls(
internal::implicit_cast<MockClass*>(this));
}
template <typename A1, typename A2, typename A3>
NiceMock(const A1& a1, const A2& a2, const A3& a3) : MockClass(a1, a2, a3) {
Mock::AllowUninterestingCalls(internal::implicit_cast<MockClass*>(this));
::testing::Mock::AllowUninterestingCalls(
internal::implicit_cast<MockClass*>(this));
}
template <typename A1, typename A2, typename A3, typename A4>
NiceMock(const A1& a1, const A2& a2, const A3& a3,
const A4& a4) : MockClass(a1, a2, a3, a4) {
Mock::AllowUninterestingCalls(internal::implicit_cast<MockClass*>(this));
::testing::Mock::AllowUninterestingCalls(
internal::implicit_cast<MockClass*>(this));
}
template <typename A1, typename A2, typename A3, typename A4, typename A5>
NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,
const A5& a5) : MockClass(a1, a2, a3, a4, a5) {
Mock::AllowUninterestingCalls(internal::implicit_cast<MockClass*>(this));
::testing::Mock::AllowUninterestingCalls(
internal::implicit_cast<MockClass*>(this));
}
template <typename A1, typename A2, typename A3, typename A4, typename A5,
typename A6>
NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,
const A5& a5, const A6& a6) : MockClass(a1, a2, a3, a4, a5, a6) {
Mock::AllowUninterestingCalls(internal::implicit_cast<MockClass*>(this));
::testing::Mock::AllowUninterestingCalls(
internal::implicit_cast<MockClass*>(this));
}
template <typename A1, typename A2, typename A3, typename A4, typename A5,
@@ -113,7 +120,8 @@ class NiceMock : public MockClass {
NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,
const A5& a5, const A6& a6, const A7& a7) : MockClass(a1, a2, a3, a4, a5,
a6, a7) {
Mock::AllowUninterestingCalls(internal::implicit_cast<MockClass*>(this));
::testing::Mock::AllowUninterestingCalls(
internal::implicit_cast<MockClass*>(this));
}
template <typename A1, typename A2, typename A3, typename A4, typename A5,
@@ -121,7 +129,8 @@ class NiceMock : public MockClass {
NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,
const A5& a5, const A6& a6, const A7& a7, const A8& a8) : MockClass(a1,
a2, a3, a4, a5, a6, a7, a8) {
Mock::AllowUninterestingCalls(internal::implicit_cast<MockClass*>(this));
::testing::Mock::AllowUninterestingCalls(
internal::implicit_cast<MockClass*>(this));
}
template <typename A1, typename A2, typename A3, typename A4, typename A5,
@@ -129,7 +138,8 @@ class NiceMock : public MockClass {
NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,
const A5& a5, const A6& a6, const A7& a7, const A8& a8,
const A9& a9) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8, a9) {
Mock::AllowUninterestingCalls(internal::implicit_cast<MockClass*>(this));
::testing::Mock::AllowUninterestingCalls(
internal::implicit_cast<MockClass*>(this));
}
template <typename A1, typename A2, typename A3, typename A4, typename A5,
@@ -137,11 +147,13 @@ class NiceMock : public MockClass {
NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,
const A5& a5, const A6& a6, const A7& a7, const A8& a8, const A9& a9,
const A10& a10) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) {
Mock::AllowUninterestingCalls(internal::implicit_cast<MockClass*>(this));
::testing::Mock::AllowUninterestingCalls(
internal::implicit_cast<MockClass*>(this));
}
virtual ~NiceMock() {
Mock::UnregisterCallReaction(internal::implicit_cast<MockClass*>(this));
::testing::Mock::UnregisterCallReaction(
internal::implicit_cast<MockClass*>(this));
}
};
@@ -151,40 +163,47 @@ class StrictMock : public MockClass {
// We don't factor out the constructor body to a common method, as
// we have to avoid a possible clash with members of MockClass.
StrictMock() {
Mock::FailUninterestingCalls(internal::implicit_cast<MockClass*>(this));
::testing::Mock::FailUninterestingCalls(
internal::implicit_cast<MockClass*>(this));
}
template <typename A1>
explicit StrictMock(const A1& a1) : MockClass(a1) {
Mock::FailUninterestingCalls(internal::implicit_cast<MockClass*>(this));
::testing::Mock::FailUninterestingCalls(
internal::implicit_cast<MockClass*>(this));
}
template <typename A1, typename A2>
StrictMock(const A1& a1, const A2& a2) : MockClass(a1, a2) {
Mock::FailUninterestingCalls(internal::implicit_cast<MockClass*>(this));
::testing::Mock::FailUninterestingCalls(
internal::implicit_cast<MockClass*>(this));
}
template <typename A1, typename A2, typename A3>
StrictMock(const A1& a1, const A2& a2, const A3& a3) : MockClass(a1, a2, a3) {
Mock::FailUninterestingCalls(internal::implicit_cast<MockClass*>(this));
::testing::Mock::FailUninterestingCalls(
internal::implicit_cast<MockClass*>(this));
}
template <typename A1, typename A2, typename A3, typename A4>
StrictMock(const A1& a1, const A2& a2, const A3& a3,
const A4& a4) : MockClass(a1, a2, a3, a4) {
Mock::FailUninterestingCalls(internal::implicit_cast<MockClass*>(this));
::testing::Mock::FailUninterestingCalls(
internal::implicit_cast<MockClass*>(this));
}
template <typename A1, typename A2, typename A3, typename A4, typename A5>
StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,
const A5& a5) : MockClass(a1, a2, a3, a4, a5) {
Mock::FailUninterestingCalls(internal::implicit_cast<MockClass*>(this));
::testing::Mock::FailUninterestingCalls(
internal::implicit_cast<MockClass*>(this));
}
template <typename A1, typename A2, typename A3, typename A4, typename A5,
typename A6>
StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,
const A5& a5, const A6& a6) : MockClass(a1, a2, a3, a4, a5, a6) {
Mock::FailUninterestingCalls(internal::implicit_cast<MockClass*>(this));
::testing::Mock::FailUninterestingCalls(
internal::implicit_cast<MockClass*>(this));
}
template <typename A1, typename A2, typename A3, typename A4, typename A5,
@@ -192,7 +211,8 @@ class StrictMock : public MockClass {
StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,
const A5& a5, const A6& a6, const A7& a7) : MockClass(a1, a2, a3, a4, a5,
a6, a7) {
Mock::FailUninterestingCalls(internal::implicit_cast<MockClass*>(this));
::testing::Mock::FailUninterestingCalls(
internal::implicit_cast<MockClass*>(this));
}
template <typename A1, typename A2, typename A3, typename A4, typename A5,
@@ -200,7 +220,8 @@ class StrictMock : public MockClass {
StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,
const A5& a5, const A6& a6, const A7& a7, const A8& a8) : MockClass(a1,
a2, a3, a4, a5, a6, a7, a8) {
Mock::FailUninterestingCalls(internal::implicit_cast<MockClass*>(this));
::testing::Mock::FailUninterestingCalls(
internal::implicit_cast<MockClass*>(this));
}
template <typename A1, typename A2, typename A3, typename A4, typename A5,
@@ -208,7 +229,8 @@ class StrictMock : public MockClass {
StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,
const A5& a5, const A6& a6, const A7& a7, const A8& a8,
const A9& a9) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8, a9) {
Mock::FailUninterestingCalls(internal::implicit_cast<MockClass*>(this));
::testing::Mock::FailUninterestingCalls(
internal::implicit_cast<MockClass*>(this));
}
template <typename A1, typename A2, typename A3, typename A4, typename A5,
@@ -216,11 +238,13 @@ class StrictMock : public MockClass {
StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,
const A5& a5, const A6& a6, const A7& a7, const A8& a8, const A9& a9,
const A10& a10) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) {
Mock::FailUninterestingCalls(internal::implicit_cast<MockClass*>(this));
::testing::Mock::FailUninterestingCalls(
internal::implicit_cast<MockClass*>(this));
}
virtual ~StrictMock() {
Mock::UnregisterCallReaction(internal::implicit_cast<MockClass*>(this));
::testing::Mock::UnregisterCallReaction(
internal::implicit_cast<MockClass*>(this));
}
};

View File

@@ -73,14 +73,16 @@ class NiceMock : public MockClass {
// We don't factor out the constructor body to a common method, as
// we have to avoid a possible clash with members of MockClass.
NiceMock() {
Mock::AllowUninterestingCalls(internal::implicit_cast<MockClass*>(this));
::testing::Mock::AllowUninterestingCalls(
internal::implicit_cast<MockClass*>(this));
}
// C++ doesn't (yet) allow inheritance of constructors, so we have
// to define it for each arity.
template <typename A1>
explicit NiceMock(const A1& a1) : MockClass(a1) {
Mock::AllowUninterestingCalls(internal::implicit_cast<MockClass*>(this));
::testing::Mock::AllowUninterestingCalls(
internal::implicit_cast<MockClass*>(this));
}
$range i 2..n
@@ -88,13 +90,15 @@ $for i [[
$range j 1..i
template <$for j, [[typename A$j]]>
NiceMock($for j, [[const A$j& a$j]]) : MockClass($for j, [[a$j]]) {
Mock::AllowUninterestingCalls(internal::implicit_cast<MockClass*>(this));
::testing::Mock::AllowUninterestingCalls(
internal::implicit_cast<MockClass*>(this));
}
]]
virtual ~NiceMock() {
Mock::UnregisterCallReaction(internal::implicit_cast<MockClass*>(this));
::testing::Mock::UnregisterCallReaction(
internal::implicit_cast<MockClass*>(this));
}
};
@@ -104,25 +108,29 @@ class StrictMock : public MockClass {
// We don't factor out the constructor body to a common method, as
// we have to avoid a possible clash with members of MockClass.
StrictMock() {
Mock::FailUninterestingCalls(internal::implicit_cast<MockClass*>(this));
::testing::Mock::FailUninterestingCalls(
internal::implicit_cast<MockClass*>(this));
}
template <typename A1>
explicit StrictMock(const A1& a1) : MockClass(a1) {
Mock::FailUninterestingCalls(internal::implicit_cast<MockClass*>(this));
::testing::Mock::FailUninterestingCalls(
internal::implicit_cast<MockClass*>(this));
}
$for i [[
$range j 1..i
template <$for j, [[typename A$j]]>
StrictMock($for j, [[const A$j& a$j]]) : MockClass($for j, [[a$j]]) {
Mock::FailUninterestingCalls(internal::implicit_cast<MockClass*>(this));
::testing::Mock::FailUninterestingCalls(
internal::implicit_cast<MockClass*>(this));
}
]]
virtual ~StrictMock() {
Mock::UnregisterCallReaction(internal::implicit_cast<MockClass*>(this));
::testing::Mock::UnregisterCallReaction(
internal::implicit_cast<MockClass*>(this));
}
};

View File

@@ -581,21 +581,9 @@ class NativeArray {
typedef Element value_type;
typedef const Element* const_iterator;
// Constructs from a native array passed by reference.
template <size_t N>
NativeArray(const Element (&array)[N], RelationToSource relation) {
Init(array, N, relation);
}
// Constructs from a native array passed by a pointer and a size.
// For generality we don't artificially restrict the types of the
// pointer and the size.
template <typename Pointer, typename Size>
NativeArray(const ::std::tr1::tuple<Pointer, Size>& array,
RelationToSource relation) {
Init(internal::GetRawPointer(::std::tr1::get<0>(array)),
::std::tr1::get<1>(array),
relation);
// Constructs from a native array.
NativeArray(const Element* array, size_t count, RelationToSource relation) {
Init(array, count, relation);
}
// Copy constructor.
@@ -691,10 +679,10 @@ class StlContainerView<Element[N]> {
static const_reference ConstReference(const Element (&array)[N]) {
// Ensures that Element is not a const type.
testing::StaticAssertTypeEq<Element, RawElement>();
return type(array, kReference);
return type(array, N, kReference);
}
static type Copy(const Element (&array)[N]) {
return type(array, kCopy);
return type(array, N, kCopy);
}
};
@@ -710,10 +698,12 @@ class StlContainerView< ::std::tr1::tuple<ElementPointer, Size> > {
static const_reference ConstReference(
const ::std::tr1::tuple<ElementPointer, Size>& array) {
return type(array, kReference);
using ::std::tr1::get;
return type(get<0>(array), get<1>(array), kReference);
}
static type Copy(const ::std::tr1::tuple<ElementPointer, Size>& array) {
return type(array, kCopy);
using ::std::tr1::get;
return type(get<0>(array), get<1>(array), kCopy);
}
};