113481Sgiacomo.travaglini@arm.com// This file was GENERATED by command:
213481Sgiacomo.travaglini@arm.com//     pump.py gmock-generated-matchers.h.pump
313481Sgiacomo.travaglini@arm.com// DO NOT EDIT BY HAND!!!
413481Sgiacomo.travaglini@arm.com
513481Sgiacomo.travaglini@arm.com// Copyright 2008, Google Inc.
613481Sgiacomo.travaglini@arm.com// All rights reserved.
713481Sgiacomo.travaglini@arm.com//
813481Sgiacomo.travaglini@arm.com// Redistribution and use in source and binary forms, with or without
913481Sgiacomo.travaglini@arm.com// modification, are permitted provided that the following conditions are
1013481Sgiacomo.travaglini@arm.com// met:
1113481Sgiacomo.travaglini@arm.com//
1213481Sgiacomo.travaglini@arm.com//     * Redistributions of source code must retain the above copyright
1313481Sgiacomo.travaglini@arm.com// notice, this list of conditions and the following disclaimer.
1413481Sgiacomo.travaglini@arm.com//     * Redistributions in binary form must reproduce the above
1513481Sgiacomo.travaglini@arm.com// copyright notice, this list of conditions and the following disclaimer
1613481Sgiacomo.travaglini@arm.com// in the documentation and/or other materials provided with the
1713481Sgiacomo.travaglini@arm.com// distribution.
1813481Sgiacomo.travaglini@arm.com//     * Neither the name of Google Inc. nor the names of its
1913481Sgiacomo.travaglini@arm.com// contributors may be used to endorse or promote products derived from
2013481Sgiacomo.travaglini@arm.com// this software without specific prior written permission.
2113481Sgiacomo.travaglini@arm.com//
2213481Sgiacomo.travaglini@arm.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2313481Sgiacomo.travaglini@arm.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2413481Sgiacomo.travaglini@arm.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2513481Sgiacomo.travaglini@arm.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2613481Sgiacomo.travaglini@arm.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2713481Sgiacomo.travaglini@arm.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2813481Sgiacomo.travaglini@arm.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2913481Sgiacomo.travaglini@arm.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3013481Sgiacomo.travaglini@arm.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3113481Sgiacomo.travaglini@arm.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3213481Sgiacomo.travaglini@arm.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3313481Sgiacomo.travaglini@arm.com
3413481Sgiacomo.travaglini@arm.com// Google Mock - a framework for writing C++ mock classes.
3513481Sgiacomo.travaglini@arm.com//
3613481Sgiacomo.travaglini@arm.com// This file implements some commonly used variadic matchers.
3713481Sgiacomo.travaglini@arm.com
3813481Sgiacomo.travaglini@arm.com#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_
3913481Sgiacomo.travaglini@arm.com#define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_
4013481Sgiacomo.travaglini@arm.com
4113481Sgiacomo.travaglini@arm.com#include <iterator>
4213481Sgiacomo.travaglini@arm.com#include <sstream>
4313481Sgiacomo.travaglini@arm.com#include <string>
4413481Sgiacomo.travaglini@arm.com#include <vector>
4513481Sgiacomo.travaglini@arm.com#include "gmock/gmock-matchers.h"
4613481Sgiacomo.travaglini@arm.com
4713481Sgiacomo.travaglini@arm.comnamespace testing {
4813481Sgiacomo.travaglini@arm.comnamespace internal {
4913481Sgiacomo.travaglini@arm.com
5013481Sgiacomo.travaglini@arm.com// The type of the i-th (0-based) field of Tuple.
5113481Sgiacomo.travaglini@arm.com#define GMOCK_FIELD_TYPE_(Tuple, i) \
5213481Sgiacomo.travaglini@arm.com    typename ::testing::tuple_element<i, Tuple>::type
5313481Sgiacomo.travaglini@arm.com
5413481Sgiacomo.travaglini@arm.com// TupleFields<Tuple, k0, ..., kn> is for selecting fields from a
5513481Sgiacomo.travaglini@arm.com// tuple of type Tuple.  It has two members:
5613481Sgiacomo.travaglini@arm.com//
5713481Sgiacomo.travaglini@arm.com//   type: a tuple type whose i-th field is the ki-th field of Tuple.
5813481Sgiacomo.travaglini@arm.com//   GetSelectedFields(t): returns fields k0, ..., and kn of t as a tuple.
5913481Sgiacomo.travaglini@arm.com//
6013481Sgiacomo.travaglini@arm.com// For example, in class TupleFields<tuple<bool, char, int>, 2, 0>, we have:
6113481Sgiacomo.travaglini@arm.com//
6213481Sgiacomo.travaglini@arm.com//   type is tuple<int, bool>, and
6313481Sgiacomo.travaglini@arm.com//   GetSelectedFields(make_tuple(true, 'a', 42)) is (42, true).
6413481Sgiacomo.travaglini@arm.com
6513481Sgiacomo.travaglini@arm.comtemplate <class Tuple, int k0 = -1, int k1 = -1, int k2 = -1, int k3 = -1,
6613481Sgiacomo.travaglini@arm.com    int k4 = -1, int k5 = -1, int k6 = -1, int k7 = -1, int k8 = -1,
6713481Sgiacomo.travaglini@arm.com    int k9 = -1>
6813481Sgiacomo.travaglini@arm.comclass TupleFields;
6913481Sgiacomo.travaglini@arm.com
7013481Sgiacomo.travaglini@arm.com// This generic version is used when there are 10 selectors.
7113481Sgiacomo.travaglini@arm.comtemplate <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5, int k6,
7213481Sgiacomo.travaglini@arm.com    int k7, int k8, int k9>
7313481Sgiacomo.travaglini@arm.comclass TupleFields {
7413481Sgiacomo.travaglini@arm.com public:
7513481Sgiacomo.travaglini@arm.com  typedef ::testing::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),
7613481Sgiacomo.travaglini@arm.com      GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2),
7713481Sgiacomo.travaglini@arm.com      GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4),
7813481Sgiacomo.travaglini@arm.com      GMOCK_FIELD_TYPE_(Tuple, k5), GMOCK_FIELD_TYPE_(Tuple, k6),
7913481Sgiacomo.travaglini@arm.com      GMOCK_FIELD_TYPE_(Tuple, k7), GMOCK_FIELD_TYPE_(Tuple, k8),
8013481Sgiacomo.travaglini@arm.com      GMOCK_FIELD_TYPE_(Tuple, k9)> type;
8113481Sgiacomo.travaglini@arm.com  static type GetSelectedFields(const Tuple& t) {
8213481Sgiacomo.travaglini@arm.com    return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t),
8313481Sgiacomo.travaglini@arm.com        get<k5>(t), get<k6>(t), get<k7>(t), get<k8>(t), get<k9>(t));
8413481Sgiacomo.travaglini@arm.com  }
8513481Sgiacomo.travaglini@arm.com};
8613481Sgiacomo.travaglini@arm.com
8713481Sgiacomo.travaglini@arm.com// The following specialization is used for 0 ~ 9 selectors.
8813481Sgiacomo.travaglini@arm.com
8913481Sgiacomo.travaglini@arm.comtemplate <class Tuple>
9013481Sgiacomo.travaglini@arm.comclass TupleFields<Tuple, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1> {
9113481Sgiacomo.travaglini@arm.com public:
9213481Sgiacomo.travaglini@arm.com  typedef ::testing::tuple<> type;
9313481Sgiacomo.travaglini@arm.com  static type GetSelectedFields(const Tuple& /* t */) {
9413481Sgiacomo.travaglini@arm.com    return type();
9513481Sgiacomo.travaglini@arm.com  }
9613481Sgiacomo.travaglini@arm.com};
9713481Sgiacomo.travaglini@arm.com
9813481Sgiacomo.travaglini@arm.comtemplate <class Tuple, int k0>
9913481Sgiacomo.travaglini@arm.comclass TupleFields<Tuple, k0, -1, -1, -1, -1, -1, -1, -1, -1, -1> {
10013481Sgiacomo.travaglini@arm.com public:
10113481Sgiacomo.travaglini@arm.com  typedef ::testing::tuple<GMOCK_FIELD_TYPE_(Tuple, k0)> type;
10213481Sgiacomo.travaglini@arm.com  static type GetSelectedFields(const Tuple& t) {
10313481Sgiacomo.travaglini@arm.com    return type(get<k0>(t));
10413481Sgiacomo.travaglini@arm.com  }
10513481Sgiacomo.travaglini@arm.com};
10613481Sgiacomo.travaglini@arm.com
10713481Sgiacomo.travaglini@arm.comtemplate <class Tuple, int k0, int k1>
10813481Sgiacomo.travaglini@arm.comclass TupleFields<Tuple, k0, k1, -1, -1, -1, -1, -1, -1, -1, -1> {
10913481Sgiacomo.travaglini@arm.com public:
11013481Sgiacomo.travaglini@arm.com  typedef ::testing::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),
11113481Sgiacomo.travaglini@arm.com      GMOCK_FIELD_TYPE_(Tuple, k1)> type;
11213481Sgiacomo.travaglini@arm.com  static type GetSelectedFields(const Tuple& t) {
11313481Sgiacomo.travaglini@arm.com    return type(get<k0>(t), get<k1>(t));
11413481Sgiacomo.travaglini@arm.com  }
11513481Sgiacomo.travaglini@arm.com};
11613481Sgiacomo.travaglini@arm.com
11713481Sgiacomo.travaglini@arm.comtemplate <class Tuple, int k0, int k1, int k2>
11813481Sgiacomo.travaglini@arm.comclass TupleFields<Tuple, k0, k1, k2, -1, -1, -1, -1, -1, -1, -1> {
11913481Sgiacomo.travaglini@arm.com public:
12013481Sgiacomo.travaglini@arm.com  typedef ::testing::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),
12113481Sgiacomo.travaglini@arm.com      GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2)> type;
12213481Sgiacomo.travaglini@arm.com  static type GetSelectedFields(const Tuple& t) {
12313481Sgiacomo.travaglini@arm.com    return type(get<k0>(t), get<k1>(t), get<k2>(t));
12413481Sgiacomo.travaglini@arm.com  }
12513481Sgiacomo.travaglini@arm.com};
12613481Sgiacomo.travaglini@arm.com
12713481Sgiacomo.travaglini@arm.comtemplate <class Tuple, int k0, int k1, int k2, int k3>
12813481Sgiacomo.travaglini@arm.comclass TupleFields<Tuple, k0, k1, k2, k3, -1, -1, -1, -1, -1, -1> {
12913481Sgiacomo.travaglini@arm.com public:
13013481Sgiacomo.travaglini@arm.com  typedef ::testing::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),
13113481Sgiacomo.travaglini@arm.com      GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2),
13213481Sgiacomo.travaglini@arm.com      GMOCK_FIELD_TYPE_(Tuple, k3)> type;
13313481Sgiacomo.travaglini@arm.com  static type GetSelectedFields(const Tuple& t) {
13413481Sgiacomo.travaglini@arm.com    return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t));
13513481Sgiacomo.travaglini@arm.com  }
13613481Sgiacomo.travaglini@arm.com};
13713481Sgiacomo.travaglini@arm.com
13813481Sgiacomo.travaglini@arm.comtemplate <class Tuple, int k0, int k1, int k2, int k3, int k4>
13913481Sgiacomo.travaglini@arm.comclass TupleFields<Tuple, k0, k1, k2, k3, k4, -1, -1, -1, -1, -1> {
14013481Sgiacomo.travaglini@arm.com public:
14113481Sgiacomo.travaglini@arm.com  typedef ::testing::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),
14213481Sgiacomo.travaglini@arm.com      GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2),
14313481Sgiacomo.travaglini@arm.com      GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4)> type;
14413481Sgiacomo.travaglini@arm.com  static type GetSelectedFields(const Tuple& t) {
14513481Sgiacomo.travaglini@arm.com    return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t));
14613481Sgiacomo.travaglini@arm.com  }
14713481Sgiacomo.travaglini@arm.com};
14813481Sgiacomo.travaglini@arm.com
14913481Sgiacomo.travaglini@arm.comtemplate <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5>
15013481Sgiacomo.travaglini@arm.comclass TupleFields<Tuple, k0, k1, k2, k3, k4, k5, -1, -1, -1, -1> {
15113481Sgiacomo.travaglini@arm.com public:
15213481Sgiacomo.travaglini@arm.com  typedef ::testing::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),
15313481Sgiacomo.travaglini@arm.com      GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2),
15413481Sgiacomo.travaglini@arm.com      GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4),
15513481Sgiacomo.travaglini@arm.com      GMOCK_FIELD_TYPE_(Tuple, k5)> type;
15613481Sgiacomo.travaglini@arm.com  static type GetSelectedFields(const Tuple& t) {
15713481Sgiacomo.travaglini@arm.com    return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t),
15813481Sgiacomo.travaglini@arm.com        get<k5>(t));
15913481Sgiacomo.travaglini@arm.com  }
16013481Sgiacomo.travaglini@arm.com};
16113481Sgiacomo.travaglini@arm.com
16213481Sgiacomo.travaglini@arm.comtemplate <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5, int k6>
16313481Sgiacomo.travaglini@arm.comclass TupleFields<Tuple, k0, k1, k2, k3, k4, k5, k6, -1, -1, -1> {
16413481Sgiacomo.travaglini@arm.com public:
16513481Sgiacomo.travaglini@arm.com  typedef ::testing::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),
16613481Sgiacomo.travaglini@arm.com      GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2),
16713481Sgiacomo.travaglini@arm.com      GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4),
16813481Sgiacomo.travaglini@arm.com      GMOCK_FIELD_TYPE_(Tuple, k5), GMOCK_FIELD_TYPE_(Tuple, k6)> type;
16913481Sgiacomo.travaglini@arm.com  static type GetSelectedFields(const Tuple& t) {
17013481Sgiacomo.travaglini@arm.com    return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t),
17113481Sgiacomo.travaglini@arm.com        get<k5>(t), get<k6>(t));
17213481Sgiacomo.travaglini@arm.com  }
17313481Sgiacomo.travaglini@arm.com};
17413481Sgiacomo.travaglini@arm.com
17513481Sgiacomo.travaglini@arm.comtemplate <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5, int k6,
17613481Sgiacomo.travaglini@arm.com    int k7>
17713481Sgiacomo.travaglini@arm.comclass TupleFields<Tuple, k0, k1, k2, k3, k4, k5, k6, k7, -1, -1> {
17813481Sgiacomo.travaglini@arm.com public:
17913481Sgiacomo.travaglini@arm.com  typedef ::testing::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),
18013481Sgiacomo.travaglini@arm.com      GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2),
18113481Sgiacomo.travaglini@arm.com      GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4),
18213481Sgiacomo.travaglini@arm.com      GMOCK_FIELD_TYPE_(Tuple, k5), GMOCK_FIELD_TYPE_(Tuple, k6),
18313481Sgiacomo.travaglini@arm.com      GMOCK_FIELD_TYPE_(Tuple, k7)> type;
18413481Sgiacomo.travaglini@arm.com  static type GetSelectedFields(const Tuple& t) {
18513481Sgiacomo.travaglini@arm.com    return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t),
18613481Sgiacomo.travaglini@arm.com        get<k5>(t), get<k6>(t), get<k7>(t));
18713481Sgiacomo.travaglini@arm.com  }
18813481Sgiacomo.travaglini@arm.com};
18913481Sgiacomo.travaglini@arm.com
19013481Sgiacomo.travaglini@arm.comtemplate <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5, int k6,
19113481Sgiacomo.travaglini@arm.com    int k7, int k8>
19213481Sgiacomo.travaglini@arm.comclass TupleFields<Tuple, k0, k1, k2, k3, k4, k5, k6, k7, k8, -1> {
19313481Sgiacomo.travaglini@arm.com public:
19413481Sgiacomo.travaglini@arm.com  typedef ::testing::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),
19513481Sgiacomo.travaglini@arm.com      GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2),
19613481Sgiacomo.travaglini@arm.com      GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4),
19713481Sgiacomo.travaglini@arm.com      GMOCK_FIELD_TYPE_(Tuple, k5), GMOCK_FIELD_TYPE_(Tuple, k6),
19813481Sgiacomo.travaglini@arm.com      GMOCK_FIELD_TYPE_(Tuple, k7), GMOCK_FIELD_TYPE_(Tuple, k8)> type;
19913481Sgiacomo.travaglini@arm.com  static type GetSelectedFields(const Tuple& t) {
20013481Sgiacomo.travaglini@arm.com    return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t),
20113481Sgiacomo.travaglini@arm.com        get<k5>(t), get<k6>(t), get<k7>(t), get<k8>(t));
20213481Sgiacomo.travaglini@arm.com  }
20313481Sgiacomo.travaglini@arm.com};
20413481Sgiacomo.travaglini@arm.com
20513481Sgiacomo.travaglini@arm.com#undef GMOCK_FIELD_TYPE_
20613481Sgiacomo.travaglini@arm.com
20713481Sgiacomo.travaglini@arm.com// Implements the Args() matcher.
20813481Sgiacomo.travaglini@arm.comtemplate <class ArgsTuple, int k0 = -1, int k1 = -1, int k2 = -1, int k3 = -1,
20913481Sgiacomo.travaglini@arm.com    int k4 = -1, int k5 = -1, int k6 = -1, int k7 = -1, int k8 = -1,
21013481Sgiacomo.travaglini@arm.com    int k9 = -1>
21113481Sgiacomo.travaglini@arm.comclass ArgsMatcherImpl : public MatcherInterface<ArgsTuple> {
21213481Sgiacomo.travaglini@arm.com public:
21313481Sgiacomo.travaglini@arm.com  // ArgsTuple may have top-level const or reference modifiers.
21413481Sgiacomo.travaglini@arm.com  typedef GTEST_REMOVE_REFERENCE_AND_CONST_(ArgsTuple) RawArgsTuple;
21513481Sgiacomo.travaglini@arm.com  typedef typename internal::TupleFields<RawArgsTuple, k0, k1, k2, k3, k4, k5,
21613481Sgiacomo.travaglini@arm.com      k6, k7, k8, k9>::type SelectedArgs;
21713481Sgiacomo.travaglini@arm.com  typedef Matcher<const SelectedArgs&> MonomorphicInnerMatcher;
21813481Sgiacomo.travaglini@arm.com
21913481Sgiacomo.travaglini@arm.com  template <typename InnerMatcher>
22013481Sgiacomo.travaglini@arm.com  explicit ArgsMatcherImpl(const InnerMatcher& inner_matcher)
22113481Sgiacomo.travaglini@arm.com      : inner_matcher_(SafeMatcherCast<const SelectedArgs&>(inner_matcher)) {}
22213481Sgiacomo.travaglini@arm.com
22313481Sgiacomo.travaglini@arm.com  virtual bool MatchAndExplain(ArgsTuple args,
22413481Sgiacomo.travaglini@arm.com                               MatchResultListener* listener) const {
22513481Sgiacomo.travaglini@arm.com    const SelectedArgs& selected_args = GetSelectedArgs(args);
22613481Sgiacomo.travaglini@arm.com    if (!listener->IsInterested())
22713481Sgiacomo.travaglini@arm.com      return inner_matcher_.Matches(selected_args);
22813481Sgiacomo.travaglini@arm.com
22913481Sgiacomo.travaglini@arm.com    PrintIndices(listener->stream());
23013481Sgiacomo.travaglini@arm.com    *listener << "are " << PrintToString(selected_args);
23113481Sgiacomo.travaglini@arm.com
23213481Sgiacomo.travaglini@arm.com    StringMatchResultListener inner_listener;
23313481Sgiacomo.travaglini@arm.com    const bool match = inner_matcher_.MatchAndExplain(selected_args,
23413481Sgiacomo.travaglini@arm.com                                                      &inner_listener);
23513481Sgiacomo.travaglini@arm.com    PrintIfNotEmpty(inner_listener.str(), listener->stream());
23613481Sgiacomo.travaglini@arm.com    return match;
23713481Sgiacomo.travaglini@arm.com  }
23813481Sgiacomo.travaglini@arm.com
23913481Sgiacomo.travaglini@arm.com  virtual void DescribeTo(::std::ostream* os) const {
24013481Sgiacomo.travaglini@arm.com    *os << "are a tuple ";
24113481Sgiacomo.travaglini@arm.com    PrintIndices(os);
24213481Sgiacomo.travaglini@arm.com    inner_matcher_.DescribeTo(os);
24313481Sgiacomo.travaglini@arm.com  }
24413481Sgiacomo.travaglini@arm.com
24513481Sgiacomo.travaglini@arm.com  virtual void DescribeNegationTo(::std::ostream* os) const {
24613481Sgiacomo.travaglini@arm.com    *os << "are a tuple ";
24713481Sgiacomo.travaglini@arm.com    PrintIndices(os);
24813481Sgiacomo.travaglini@arm.com    inner_matcher_.DescribeNegationTo(os);
24913481Sgiacomo.travaglini@arm.com  }
25013481Sgiacomo.travaglini@arm.com
25113481Sgiacomo.travaglini@arm.com private:
25213481Sgiacomo.travaglini@arm.com  static SelectedArgs GetSelectedArgs(ArgsTuple args) {
25313481Sgiacomo.travaglini@arm.com    return TupleFields<RawArgsTuple, k0, k1, k2, k3, k4, k5, k6, k7, k8,
25413481Sgiacomo.travaglini@arm.com        k9>::GetSelectedFields(args);
25513481Sgiacomo.travaglini@arm.com  }
25613481Sgiacomo.travaglini@arm.com
25713481Sgiacomo.travaglini@arm.com  // Prints the indices of the selected fields.
25813481Sgiacomo.travaglini@arm.com  static void PrintIndices(::std::ostream* os) {
25913481Sgiacomo.travaglini@arm.com    *os << "whose fields (";
26013481Sgiacomo.travaglini@arm.com    const int indices[10] = { k0, k1, k2, k3, k4, k5, k6, k7, k8, k9 };
26113481Sgiacomo.travaglini@arm.com    for (int i = 0; i < 10; i++) {
26213481Sgiacomo.travaglini@arm.com      if (indices[i] < 0)
26313481Sgiacomo.travaglini@arm.com        break;
26413481Sgiacomo.travaglini@arm.com
26513481Sgiacomo.travaglini@arm.com      if (i >= 1)
26613481Sgiacomo.travaglini@arm.com        *os << ", ";
26713481Sgiacomo.travaglini@arm.com
26813481Sgiacomo.travaglini@arm.com      *os << "#" << indices[i];
26913481Sgiacomo.travaglini@arm.com    }
27013481Sgiacomo.travaglini@arm.com    *os << ") ";
27113481Sgiacomo.travaglini@arm.com  }
27213481Sgiacomo.travaglini@arm.com
27313481Sgiacomo.travaglini@arm.com  const MonomorphicInnerMatcher inner_matcher_;
27413481Sgiacomo.travaglini@arm.com
27513481Sgiacomo.travaglini@arm.com  GTEST_DISALLOW_ASSIGN_(ArgsMatcherImpl);
27613481Sgiacomo.travaglini@arm.com};
27713481Sgiacomo.travaglini@arm.com
27813481Sgiacomo.travaglini@arm.comtemplate <class InnerMatcher, int k0 = -1, int k1 = -1, int k2 = -1,
27913481Sgiacomo.travaglini@arm.com    int k3 = -1, int k4 = -1, int k5 = -1, int k6 = -1, int k7 = -1,
28013481Sgiacomo.travaglini@arm.com    int k8 = -1, int k9 = -1>
28113481Sgiacomo.travaglini@arm.comclass ArgsMatcher {
28213481Sgiacomo.travaglini@arm.com public:
28313481Sgiacomo.travaglini@arm.com  explicit ArgsMatcher(const InnerMatcher& inner_matcher)
28413481Sgiacomo.travaglini@arm.com      : inner_matcher_(inner_matcher) {}
28513481Sgiacomo.travaglini@arm.com
28613481Sgiacomo.travaglini@arm.com  template <typename ArgsTuple>
28713481Sgiacomo.travaglini@arm.com  operator Matcher<ArgsTuple>() const {
28813481Sgiacomo.travaglini@arm.com    return MakeMatcher(new ArgsMatcherImpl<ArgsTuple, k0, k1, k2, k3, k4, k5,
28913481Sgiacomo.travaglini@arm.com        k6, k7, k8, k9>(inner_matcher_));
29013481Sgiacomo.travaglini@arm.com  }
29113481Sgiacomo.travaglini@arm.com
29213481Sgiacomo.travaglini@arm.com private:
29313481Sgiacomo.travaglini@arm.com  const InnerMatcher inner_matcher_;
29413481Sgiacomo.travaglini@arm.com
29513481Sgiacomo.travaglini@arm.com  GTEST_DISALLOW_ASSIGN_(ArgsMatcher);
29613481Sgiacomo.travaglini@arm.com};
29713481Sgiacomo.travaglini@arm.com
29813481Sgiacomo.travaglini@arm.com// A set of metafunctions for computing the result type of AllOf.
29913481Sgiacomo.travaglini@arm.com// AllOf(m1, ..., mN) returns
30013481Sgiacomo.travaglini@arm.com// AllOfResultN<decltype(m1), ..., decltype(mN)>::type.
30113481Sgiacomo.travaglini@arm.com
30213481Sgiacomo.travaglini@arm.com// Although AllOf isn't defined for one argument, AllOfResult1 is defined
30313481Sgiacomo.travaglini@arm.com// to simplify the implementation.
30413481Sgiacomo.travaglini@arm.comtemplate <typename M1>
30513481Sgiacomo.travaglini@arm.comstruct AllOfResult1 {
30613481Sgiacomo.travaglini@arm.com  typedef M1 type;
30713481Sgiacomo.travaglini@arm.com};
30813481Sgiacomo.travaglini@arm.com
30913481Sgiacomo.travaglini@arm.comtemplate <typename M1, typename M2>
31013481Sgiacomo.travaglini@arm.comstruct AllOfResult2 {
31113481Sgiacomo.travaglini@arm.com  typedef BothOfMatcher<
31213481Sgiacomo.travaglini@arm.com      typename AllOfResult1<M1>::type,
31313481Sgiacomo.travaglini@arm.com      typename AllOfResult1<M2>::type
31413481Sgiacomo.travaglini@arm.com  > type;
31513481Sgiacomo.travaglini@arm.com};
31613481Sgiacomo.travaglini@arm.com
31713481Sgiacomo.travaglini@arm.comtemplate <typename M1, typename M2, typename M3>
31813481Sgiacomo.travaglini@arm.comstruct AllOfResult3 {
31913481Sgiacomo.travaglini@arm.com  typedef BothOfMatcher<
32013481Sgiacomo.travaglini@arm.com      typename AllOfResult1<M1>::type,
32113481Sgiacomo.travaglini@arm.com      typename AllOfResult2<M2, M3>::type
32213481Sgiacomo.travaglini@arm.com  > type;
32313481Sgiacomo.travaglini@arm.com};
32413481Sgiacomo.travaglini@arm.com
32513481Sgiacomo.travaglini@arm.comtemplate <typename M1, typename M2, typename M3, typename M4>
32613481Sgiacomo.travaglini@arm.comstruct AllOfResult4 {
32713481Sgiacomo.travaglini@arm.com  typedef BothOfMatcher<
32813481Sgiacomo.travaglini@arm.com      typename AllOfResult2<M1, M2>::type,
32913481Sgiacomo.travaglini@arm.com      typename AllOfResult2<M3, M4>::type
33013481Sgiacomo.travaglini@arm.com  > type;
33113481Sgiacomo.travaglini@arm.com};
33213481Sgiacomo.travaglini@arm.com
33313481Sgiacomo.travaglini@arm.comtemplate <typename M1, typename M2, typename M3, typename M4, typename M5>
33413481Sgiacomo.travaglini@arm.comstruct AllOfResult5 {
33513481Sgiacomo.travaglini@arm.com  typedef BothOfMatcher<
33613481Sgiacomo.travaglini@arm.com      typename AllOfResult2<M1, M2>::type,
33713481Sgiacomo.travaglini@arm.com      typename AllOfResult3<M3, M4, M5>::type
33813481Sgiacomo.travaglini@arm.com  > type;
33913481Sgiacomo.travaglini@arm.com};
34013481Sgiacomo.travaglini@arm.com
34113481Sgiacomo.travaglini@arm.comtemplate <typename M1, typename M2, typename M3, typename M4, typename M5,
34213481Sgiacomo.travaglini@arm.com    typename M6>
34313481Sgiacomo.travaglini@arm.comstruct AllOfResult6 {
34413481Sgiacomo.travaglini@arm.com  typedef BothOfMatcher<
34513481Sgiacomo.travaglini@arm.com      typename AllOfResult3<M1, M2, M3>::type,
34613481Sgiacomo.travaglini@arm.com      typename AllOfResult3<M4, M5, M6>::type
34713481Sgiacomo.travaglini@arm.com  > type;
34813481Sgiacomo.travaglini@arm.com};
34913481Sgiacomo.travaglini@arm.com
35013481Sgiacomo.travaglini@arm.comtemplate <typename M1, typename M2, typename M3, typename M4, typename M5,
35113481Sgiacomo.travaglini@arm.com    typename M6, typename M7>
35213481Sgiacomo.travaglini@arm.comstruct AllOfResult7 {
35313481Sgiacomo.travaglini@arm.com  typedef BothOfMatcher<
35413481Sgiacomo.travaglini@arm.com      typename AllOfResult3<M1, M2, M3>::type,
35513481Sgiacomo.travaglini@arm.com      typename AllOfResult4<M4, M5, M6, M7>::type
35613481Sgiacomo.travaglini@arm.com  > type;
35713481Sgiacomo.travaglini@arm.com};
35813481Sgiacomo.travaglini@arm.com
35913481Sgiacomo.travaglini@arm.comtemplate <typename M1, typename M2, typename M3, typename M4, typename M5,
36013481Sgiacomo.travaglini@arm.com    typename M6, typename M7, typename M8>
36113481Sgiacomo.travaglini@arm.comstruct AllOfResult8 {
36213481Sgiacomo.travaglini@arm.com  typedef BothOfMatcher<
36313481Sgiacomo.travaglini@arm.com      typename AllOfResult4<M1, M2, M3, M4>::type,
36413481Sgiacomo.travaglini@arm.com      typename AllOfResult4<M5, M6, M7, M8>::type
36513481Sgiacomo.travaglini@arm.com  > type;
36613481Sgiacomo.travaglini@arm.com};
36713481Sgiacomo.travaglini@arm.com
36813481Sgiacomo.travaglini@arm.comtemplate <typename M1, typename M2, typename M3, typename M4, typename M5,
36913481Sgiacomo.travaglini@arm.com    typename M6, typename M7, typename M8, typename M9>
37013481Sgiacomo.travaglini@arm.comstruct AllOfResult9 {
37113481Sgiacomo.travaglini@arm.com  typedef BothOfMatcher<
37213481Sgiacomo.travaglini@arm.com      typename AllOfResult4<M1, M2, M3, M4>::type,
37313481Sgiacomo.travaglini@arm.com      typename AllOfResult5<M5, M6, M7, M8, M9>::type
37413481Sgiacomo.travaglini@arm.com  > type;
37513481Sgiacomo.travaglini@arm.com};
37613481Sgiacomo.travaglini@arm.com
37713481Sgiacomo.travaglini@arm.comtemplate <typename M1, typename M2, typename M3, typename M4, typename M5,
37813481Sgiacomo.travaglini@arm.com    typename M6, typename M7, typename M8, typename M9, typename M10>
37913481Sgiacomo.travaglini@arm.comstruct AllOfResult10 {
38013481Sgiacomo.travaglini@arm.com  typedef BothOfMatcher<
38113481Sgiacomo.travaglini@arm.com      typename AllOfResult5<M1, M2, M3, M4, M5>::type,
38213481Sgiacomo.travaglini@arm.com      typename AllOfResult5<M6, M7, M8, M9, M10>::type
38313481Sgiacomo.travaglini@arm.com  > type;
38413481Sgiacomo.travaglini@arm.com};
38513481Sgiacomo.travaglini@arm.com
38613481Sgiacomo.travaglini@arm.com// A set of metafunctions for computing the result type of AnyOf.
38713481Sgiacomo.travaglini@arm.com// AnyOf(m1, ..., mN) returns
38813481Sgiacomo.travaglini@arm.com// AnyOfResultN<decltype(m1), ..., decltype(mN)>::type.
38913481Sgiacomo.travaglini@arm.com
39013481Sgiacomo.travaglini@arm.com// Although AnyOf isn't defined for one argument, AnyOfResult1 is defined
39113481Sgiacomo.travaglini@arm.com// to simplify the implementation.
39213481Sgiacomo.travaglini@arm.comtemplate <typename M1>
39313481Sgiacomo.travaglini@arm.comstruct AnyOfResult1 {
39413481Sgiacomo.travaglini@arm.com  typedef M1 type;
39513481Sgiacomo.travaglini@arm.com};
39613481Sgiacomo.travaglini@arm.com
39713481Sgiacomo.travaglini@arm.comtemplate <typename M1, typename M2>
39813481Sgiacomo.travaglini@arm.comstruct AnyOfResult2 {
39913481Sgiacomo.travaglini@arm.com  typedef EitherOfMatcher<
40013481Sgiacomo.travaglini@arm.com      typename AnyOfResult1<M1>::type,
40113481Sgiacomo.travaglini@arm.com      typename AnyOfResult1<M2>::type
40213481Sgiacomo.travaglini@arm.com  > type;
40313481Sgiacomo.travaglini@arm.com};
40413481Sgiacomo.travaglini@arm.com
40513481Sgiacomo.travaglini@arm.comtemplate <typename M1, typename M2, typename M3>
40613481Sgiacomo.travaglini@arm.comstruct AnyOfResult3 {
40713481Sgiacomo.travaglini@arm.com  typedef EitherOfMatcher<
40813481Sgiacomo.travaglini@arm.com      typename AnyOfResult1<M1>::type,
40913481Sgiacomo.travaglini@arm.com      typename AnyOfResult2<M2, M3>::type
41013481Sgiacomo.travaglini@arm.com  > type;
41113481Sgiacomo.travaglini@arm.com};
41213481Sgiacomo.travaglini@arm.com
41313481Sgiacomo.travaglini@arm.comtemplate <typename M1, typename M2, typename M3, typename M4>
41413481Sgiacomo.travaglini@arm.comstruct AnyOfResult4 {
41513481Sgiacomo.travaglini@arm.com  typedef EitherOfMatcher<
41613481Sgiacomo.travaglini@arm.com      typename AnyOfResult2<M1, M2>::type,
41713481Sgiacomo.travaglini@arm.com      typename AnyOfResult2<M3, M4>::type
41813481Sgiacomo.travaglini@arm.com  > type;
41913481Sgiacomo.travaglini@arm.com};
42013481Sgiacomo.travaglini@arm.com
42113481Sgiacomo.travaglini@arm.comtemplate <typename M1, typename M2, typename M3, typename M4, typename M5>
42213481Sgiacomo.travaglini@arm.comstruct AnyOfResult5 {
42313481Sgiacomo.travaglini@arm.com  typedef EitherOfMatcher<
42413481Sgiacomo.travaglini@arm.com      typename AnyOfResult2<M1, M2>::type,
42513481Sgiacomo.travaglini@arm.com      typename AnyOfResult3<M3, M4, M5>::type
42613481Sgiacomo.travaglini@arm.com  > type;
42713481Sgiacomo.travaglini@arm.com};
42813481Sgiacomo.travaglini@arm.com
42913481Sgiacomo.travaglini@arm.comtemplate <typename M1, typename M2, typename M3, typename M4, typename M5,
43013481Sgiacomo.travaglini@arm.com    typename M6>
43113481Sgiacomo.travaglini@arm.comstruct AnyOfResult6 {
43213481Sgiacomo.travaglini@arm.com  typedef EitherOfMatcher<
43313481Sgiacomo.travaglini@arm.com      typename AnyOfResult3<M1, M2, M3>::type,
43413481Sgiacomo.travaglini@arm.com      typename AnyOfResult3<M4, M5, M6>::type
43513481Sgiacomo.travaglini@arm.com  > type;
43613481Sgiacomo.travaglini@arm.com};
43713481Sgiacomo.travaglini@arm.com
43813481Sgiacomo.travaglini@arm.comtemplate <typename M1, typename M2, typename M3, typename M4, typename M5,
43913481Sgiacomo.travaglini@arm.com    typename M6, typename M7>
44013481Sgiacomo.travaglini@arm.comstruct AnyOfResult7 {
44113481Sgiacomo.travaglini@arm.com  typedef EitherOfMatcher<
44213481Sgiacomo.travaglini@arm.com      typename AnyOfResult3<M1, M2, M3>::type,
44313481Sgiacomo.travaglini@arm.com      typename AnyOfResult4<M4, M5, M6, M7>::type
44413481Sgiacomo.travaglini@arm.com  > type;
44513481Sgiacomo.travaglini@arm.com};
44613481Sgiacomo.travaglini@arm.com
44713481Sgiacomo.travaglini@arm.comtemplate <typename M1, typename M2, typename M3, typename M4, typename M5,
44813481Sgiacomo.travaglini@arm.com    typename M6, typename M7, typename M8>
44913481Sgiacomo.travaglini@arm.comstruct AnyOfResult8 {
45013481Sgiacomo.travaglini@arm.com  typedef EitherOfMatcher<
45113481Sgiacomo.travaglini@arm.com      typename AnyOfResult4<M1, M2, M3, M4>::type,
45213481Sgiacomo.travaglini@arm.com      typename AnyOfResult4<M5, M6, M7, M8>::type
45313481Sgiacomo.travaglini@arm.com  > type;
45413481Sgiacomo.travaglini@arm.com};
45513481Sgiacomo.travaglini@arm.com
45613481Sgiacomo.travaglini@arm.comtemplate <typename M1, typename M2, typename M3, typename M4, typename M5,
45713481Sgiacomo.travaglini@arm.com    typename M6, typename M7, typename M8, typename M9>
45813481Sgiacomo.travaglini@arm.comstruct AnyOfResult9 {
45913481Sgiacomo.travaglini@arm.com  typedef EitherOfMatcher<
46013481Sgiacomo.travaglini@arm.com      typename AnyOfResult4<M1, M2, M3, M4>::type,
46113481Sgiacomo.travaglini@arm.com      typename AnyOfResult5<M5, M6, M7, M8, M9>::type
46213481Sgiacomo.travaglini@arm.com  > type;
46313481Sgiacomo.travaglini@arm.com};
46413481Sgiacomo.travaglini@arm.com
46513481Sgiacomo.travaglini@arm.comtemplate <typename M1, typename M2, typename M3, typename M4, typename M5,
46613481Sgiacomo.travaglini@arm.com    typename M6, typename M7, typename M8, typename M9, typename M10>
46713481Sgiacomo.travaglini@arm.comstruct AnyOfResult10 {
46813481Sgiacomo.travaglini@arm.com  typedef EitherOfMatcher<
46913481Sgiacomo.travaglini@arm.com      typename AnyOfResult5<M1, M2, M3, M4, M5>::type,
47013481Sgiacomo.travaglini@arm.com      typename AnyOfResult5<M6, M7, M8, M9, M10>::type
47113481Sgiacomo.travaglini@arm.com  > type;
47213481Sgiacomo.travaglini@arm.com};
47313481Sgiacomo.travaglini@arm.com
47413481Sgiacomo.travaglini@arm.com}  // namespace internal
47513481Sgiacomo.travaglini@arm.com
47613481Sgiacomo.travaglini@arm.com// Args<N1, N2, ..., Nk>(a_matcher) matches a tuple if the selected
47713481Sgiacomo.travaglini@arm.com// fields of it matches a_matcher.  C++ doesn't support default
47813481Sgiacomo.travaglini@arm.com// arguments for function templates, so we have to overload it.
47913481Sgiacomo.travaglini@arm.comtemplate <typename InnerMatcher>
48013481Sgiacomo.travaglini@arm.cominline internal::ArgsMatcher<InnerMatcher>
48113481Sgiacomo.travaglini@arm.comArgs(const InnerMatcher& matcher) {
48213481Sgiacomo.travaglini@arm.com  return internal::ArgsMatcher<InnerMatcher>(matcher);
48313481Sgiacomo.travaglini@arm.com}
48413481Sgiacomo.travaglini@arm.com
48513481Sgiacomo.travaglini@arm.comtemplate <int k1, typename InnerMatcher>
48613481Sgiacomo.travaglini@arm.cominline internal::ArgsMatcher<InnerMatcher, k1>
48713481Sgiacomo.travaglini@arm.comArgs(const InnerMatcher& matcher) {
48813481Sgiacomo.travaglini@arm.com  return internal::ArgsMatcher<InnerMatcher, k1>(matcher);
48913481Sgiacomo.travaglini@arm.com}
49013481Sgiacomo.travaglini@arm.com
49113481Sgiacomo.travaglini@arm.comtemplate <int k1, int k2, typename InnerMatcher>
49213481Sgiacomo.travaglini@arm.cominline internal::ArgsMatcher<InnerMatcher, k1, k2>
49313481Sgiacomo.travaglini@arm.comArgs(const InnerMatcher& matcher) {
49413481Sgiacomo.travaglini@arm.com  return internal::ArgsMatcher<InnerMatcher, k1, k2>(matcher);
49513481Sgiacomo.travaglini@arm.com}
49613481Sgiacomo.travaglini@arm.com
49713481Sgiacomo.travaglini@arm.comtemplate <int k1, int k2, int k3, typename InnerMatcher>
49813481Sgiacomo.travaglini@arm.cominline internal::ArgsMatcher<InnerMatcher, k1, k2, k3>
49913481Sgiacomo.travaglini@arm.comArgs(const InnerMatcher& matcher) {
50013481Sgiacomo.travaglini@arm.com  return internal::ArgsMatcher<InnerMatcher, k1, k2, k3>(matcher);
50113481Sgiacomo.travaglini@arm.com}
50213481Sgiacomo.travaglini@arm.com
50313481Sgiacomo.travaglini@arm.comtemplate <int k1, int k2, int k3, int k4, typename InnerMatcher>
50413481Sgiacomo.travaglini@arm.cominline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4>
50513481Sgiacomo.travaglini@arm.comArgs(const InnerMatcher& matcher) {
50613481Sgiacomo.travaglini@arm.com  return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4>(matcher);
50713481Sgiacomo.travaglini@arm.com}
50813481Sgiacomo.travaglini@arm.com
50913481Sgiacomo.travaglini@arm.comtemplate <int k1, int k2, int k3, int k4, int k5, typename InnerMatcher>
51013481Sgiacomo.travaglini@arm.cominline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5>
51113481Sgiacomo.travaglini@arm.comArgs(const InnerMatcher& matcher) {
51213481Sgiacomo.travaglini@arm.com  return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5>(matcher);
51313481Sgiacomo.travaglini@arm.com}
51413481Sgiacomo.travaglini@arm.com
51513481Sgiacomo.travaglini@arm.comtemplate <int k1, int k2, int k3, int k4, int k5, int k6, typename InnerMatcher>
51613481Sgiacomo.travaglini@arm.cominline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6>
51713481Sgiacomo.travaglini@arm.comArgs(const InnerMatcher& matcher) {
51813481Sgiacomo.travaglini@arm.com  return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6>(matcher);
51913481Sgiacomo.travaglini@arm.com}
52013481Sgiacomo.travaglini@arm.com
52113481Sgiacomo.travaglini@arm.comtemplate <int k1, int k2, int k3, int k4, int k5, int k6, int k7,
52213481Sgiacomo.travaglini@arm.com    typename InnerMatcher>
52313481Sgiacomo.travaglini@arm.cominline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7>
52413481Sgiacomo.travaglini@arm.comArgs(const InnerMatcher& matcher) {
52513481Sgiacomo.travaglini@arm.com  return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6,
52613481Sgiacomo.travaglini@arm.com      k7>(matcher);
52713481Sgiacomo.travaglini@arm.com}
52813481Sgiacomo.travaglini@arm.com
52913481Sgiacomo.travaglini@arm.comtemplate <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,
53013481Sgiacomo.travaglini@arm.com    typename InnerMatcher>
53113481Sgiacomo.travaglini@arm.cominline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8>
53213481Sgiacomo.travaglini@arm.comArgs(const InnerMatcher& matcher) {
53313481Sgiacomo.travaglini@arm.com  return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7,
53413481Sgiacomo.travaglini@arm.com      k8>(matcher);
53513481Sgiacomo.travaglini@arm.com}
53613481Sgiacomo.travaglini@arm.com
53713481Sgiacomo.travaglini@arm.comtemplate <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,
53813481Sgiacomo.travaglini@arm.com    int k9, typename InnerMatcher>
53913481Sgiacomo.travaglini@arm.cominline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8, k9>
54013481Sgiacomo.travaglini@arm.comArgs(const InnerMatcher& matcher) {
54113481Sgiacomo.travaglini@arm.com  return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8,
54213481Sgiacomo.travaglini@arm.com      k9>(matcher);
54313481Sgiacomo.travaglini@arm.com}
54413481Sgiacomo.travaglini@arm.com
54513481Sgiacomo.travaglini@arm.comtemplate <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,
54613481Sgiacomo.travaglini@arm.com    int k9, int k10, typename InnerMatcher>
54713481Sgiacomo.travaglini@arm.cominline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8, k9,
54813481Sgiacomo.travaglini@arm.com    k10>
54913481Sgiacomo.travaglini@arm.comArgs(const InnerMatcher& matcher) {
55013481Sgiacomo.travaglini@arm.com  return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8,
55113481Sgiacomo.travaglini@arm.com      k9, k10>(matcher);
55213481Sgiacomo.travaglini@arm.com}
55313481Sgiacomo.travaglini@arm.com
55413481Sgiacomo.travaglini@arm.com// ElementsAre(e_1, e_2, ... e_n) matches an STL-style container with
55513481Sgiacomo.travaglini@arm.com// n elements, where the i-th element in the container must
55613481Sgiacomo.travaglini@arm.com// match the i-th argument in the list.  Each argument of
55713481Sgiacomo.travaglini@arm.com// ElementsAre() can be either a value or a matcher.  We support up to
55813481Sgiacomo.travaglini@arm.com// 10 arguments.
55913481Sgiacomo.travaglini@arm.com//
56013481Sgiacomo.travaglini@arm.com// The use of DecayArray in the implementation allows ElementsAre()
56113481Sgiacomo.travaglini@arm.com// to accept string literals, whose type is const char[N], but we
56213481Sgiacomo.travaglini@arm.com// want to treat them as const char*.
56313481Sgiacomo.travaglini@arm.com//
56413481Sgiacomo.travaglini@arm.com// NOTE: Since ElementsAre() cares about the order of the elements, it
56513481Sgiacomo.travaglini@arm.com// must not be used with containers whose elements's order is
56613481Sgiacomo.travaglini@arm.com// undefined (e.g. hash_map).
56713481Sgiacomo.travaglini@arm.com
56813481Sgiacomo.travaglini@arm.cominline internal::ElementsAreMatcher<
56913481Sgiacomo.travaglini@arm.com    ::testing::tuple<> >
57013481Sgiacomo.travaglini@arm.comElementsAre() {
57113481Sgiacomo.travaglini@arm.com  typedef ::testing::tuple<> Args;
57213481Sgiacomo.travaglini@arm.com  return internal::ElementsAreMatcher<Args>(Args());
57313481Sgiacomo.travaglini@arm.com}
57413481Sgiacomo.travaglini@arm.com
57513481Sgiacomo.travaglini@arm.comtemplate <typename T1>
57613481Sgiacomo.travaglini@arm.cominline internal::ElementsAreMatcher<
57713481Sgiacomo.travaglini@arm.com    ::testing::tuple<
57813481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T1>::type> >
57913481Sgiacomo.travaglini@arm.comElementsAre(const T1& e1) {
58013481Sgiacomo.travaglini@arm.com  typedef ::testing::tuple<
58113481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T1>::type> Args;
58213481Sgiacomo.travaglini@arm.com  return internal::ElementsAreMatcher<Args>(Args(e1));
58313481Sgiacomo.travaglini@arm.com}
58413481Sgiacomo.travaglini@arm.com
58513481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2>
58613481Sgiacomo.travaglini@arm.cominline internal::ElementsAreMatcher<
58713481Sgiacomo.travaglini@arm.com    ::testing::tuple<
58813481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T1>::type,
58913481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T2>::type> >
59013481Sgiacomo.travaglini@arm.comElementsAre(const T1& e1, const T2& e2) {
59113481Sgiacomo.travaglini@arm.com  typedef ::testing::tuple<
59213481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T1>::type,
59313481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T2>::type> Args;
59413481Sgiacomo.travaglini@arm.com  return internal::ElementsAreMatcher<Args>(Args(e1, e2));
59513481Sgiacomo.travaglini@arm.com}
59613481Sgiacomo.travaglini@arm.com
59713481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3>
59813481Sgiacomo.travaglini@arm.cominline internal::ElementsAreMatcher<
59913481Sgiacomo.travaglini@arm.com    ::testing::tuple<
60013481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T1>::type,
60113481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T2>::type,
60213481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T3>::type> >
60313481Sgiacomo.travaglini@arm.comElementsAre(const T1& e1, const T2& e2, const T3& e3) {
60413481Sgiacomo.travaglini@arm.com  typedef ::testing::tuple<
60513481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T1>::type,
60613481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T2>::type,
60713481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T3>::type> Args;
60813481Sgiacomo.travaglini@arm.com  return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3));
60913481Sgiacomo.travaglini@arm.com}
61013481Sgiacomo.travaglini@arm.com
61113481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4>
61213481Sgiacomo.travaglini@arm.cominline internal::ElementsAreMatcher<
61313481Sgiacomo.travaglini@arm.com    ::testing::tuple<
61413481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T1>::type,
61513481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T2>::type,
61613481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T3>::type,
61713481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T4>::type> >
61813481Sgiacomo.travaglini@arm.comElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4) {
61913481Sgiacomo.travaglini@arm.com  typedef ::testing::tuple<
62013481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T1>::type,
62113481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T2>::type,
62213481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T3>::type,
62313481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T4>::type> Args;
62413481Sgiacomo.travaglini@arm.com  return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3, e4));
62513481Sgiacomo.travaglini@arm.com}
62613481Sgiacomo.travaglini@arm.com
62713481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5>
62813481Sgiacomo.travaglini@arm.cominline internal::ElementsAreMatcher<
62913481Sgiacomo.travaglini@arm.com    ::testing::tuple<
63013481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T1>::type,
63113481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T2>::type,
63213481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T3>::type,
63313481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T4>::type,
63413481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T5>::type> >
63513481Sgiacomo.travaglini@arm.comElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,
63613481Sgiacomo.travaglini@arm.com    const T5& e5) {
63713481Sgiacomo.travaglini@arm.com  typedef ::testing::tuple<
63813481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T1>::type,
63913481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T2>::type,
64013481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T3>::type,
64113481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T4>::type,
64213481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T5>::type> Args;
64313481Sgiacomo.travaglini@arm.com  return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5));
64413481Sgiacomo.travaglini@arm.com}
64513481Sgiacomo.travaglini@arm.com
64613481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
64713481Sgiacomo.travaglini@arm.com    typename T6>
64813481Sgiacomo.travaglini@arm.cominline internal::ElementsAreMatcher<
64913481Sgiacomo.travaglini@arm.com    ::testing::tuple<
65013481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T1>::type,
65113481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T2>::type,
65213481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T3>::type,
65313481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T4>::type,
65413481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T5>::type,
65513481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T6>::type> >
65613481Sgiacomo.travaglini@arm.comElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,
65713481Sgiacomo.travaglini@arm.com    const T5& e5, const T6& e6) {
65813481Sgiacomo.travaglini@arm.com  typedef ::testing::tuple<
65913481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T1>::type,
66013481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T2>::type,
66113481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T3>::type,
66213481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T4>::type,
66313481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T5>::type,
66413481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T6>::type> Args;
66513481Sgiacomo.travaglini@arm.com  return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5, e6));
66613481Sgiacomo.travaglini@arm.com}
66713481Sgiacomo.travaglini@arm.com
66813481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
66913481Sgiacomo.travaglini@arm.com    typename T6, typename T7>
67013481Sgiacomo.travaglini@arm.cominline internal::ElementsAreMatcher<
67113481Sgiacomo.travaglini@arm.com    ::testing::tuple<
67213481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T1>::type,
67313481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T2>::type,
67413481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T3>::type,
67513481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T4>::type,
67613481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T5>::type,
67713481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T6>::type,
67813481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T7>::type> >
67913481Sgiacomo.travaglini@arm.comElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,
68013481Sgiacomo.travaglini@arm.com    const T5& e5, const T6& e6, const T7& e7) {
68113481Sgiacomo.travaglini@arm.com  typedef ::testing::tuple<
68213481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T1>::type,
68313481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T2>::type,
68413481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T3>::type,
68513481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T4>::type,
68613481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T5>::type,
68713481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T6>::type,
68813481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T7>::type> Args;
68913481Sgiacomo.travaglini@arm.com  return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5, e6, e7));
69013481Sgiacomo.travaglini@arm.com}
69113481Sgiacomo.travaglini@arm.com
69213481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
69313481Sgiacomo.travaglini@arm.com    typename T6, typename T7, typename T8>
69413481Sgiacomo.travaglini@arm.cominline internal::ElementsAreMatcher<
69513481Sgiacomo.travaglini@arm.com    ::testing::tuple<
69613481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T1>::type,
69713481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T2>::type,
69813481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T3>::type,
69913481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T4>::type,
70013481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T5>::type,
70113481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T6>::type,
70213481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T7>::type,
70313481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T8>::type> >
70413481Sgiacomo.travaglini@arm.comElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,
70513481Sgiacomo.travaglini@arm.com    const T5& e5, const T6& e6, const T7& e7, const T8& e8) {
70613481Sgiacomo.travaglini@arm.com  typedef ::testing::tuple<
70713481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T1>::type,
70813481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T2>::type,
70913481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T3>::type,
71013481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T4>::type,
71113481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T5>::type,
71213481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T6>::type,
71313481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T7>::type,
71413481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T8>::type> Args;
71513481Sgiacomo.travaglini@arm.com  return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5, e6, e7,
71613481Sgiacomo.travaglini@arm.com      e8));
71713481Sgiacomo.travaglini@arm.com}
71813481Sgiacomo.travaglini@arm.com
71913481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
72013481Sgiacomo.travaglini@arm.com    typename T6, typename T7, typename T8, typename T9>
72113481Sgiacomo.travaglini@arm.cominline internal::ElementsAreMatcher<
72213481Sgiacomo.travaglini@arm.com    ::testing::tuple<
72313481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T1>::type,
72413481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T2>::type,
72513481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T3>::type,
72613481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T4>::type,
72713481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T5>::type,
72813481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T6>::type,
72913481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T7>::type,
73013481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T8>::type,
73113481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T9>::type> >
73213481Sgiacomo.travaglini@arm.comElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,
73313481Sgiacomo.travaglini@arm.com    const T5& e5, const T6& e6, const T7& e7, const T8& e8, const T9& e9) {
73413481Sgiacomo.travaglini@arm.com  typedef ::testing::tuple<
73513481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T1>::type,
73613481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T2>::type,
73713481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T3>::type,
73813481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T4>::type,
73913481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T5>::type,
74013481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T6>::type,
74113481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T7>::type,
74213481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T8>::type,
74313481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T9>::type> Args;
74413481Sgiacomo.travaglini@arm.com  return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5, e6, e7,
74513481Sgiacomo.travaglini@arm.com      e8, e9));
74613481Sgiacomo.travaglini@arm.com}
74713481Sgiacomo.travaglini@arm.com
74813481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
74913481Sgiacomo.travaglini@arm.com    typename T6, typename T7, typename T8, typename T9, typename T10>
75013481Sgiacomo.travaglini@arm.cominline internal::ElementsAreMatcher<
75113481Sgiacomo.travaglini@arm.com    ::testing::tuple<
75213481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T1>::type,
75313481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T2>::type,
75413481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T3>::type,
75513481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T4>::type,
75613481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T5>::type,
75713481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T6>::type,
75813481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T7>::type,
75913481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T8>::type,
76013481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T9>::type,
76113481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T10>::type> >
76213481Sgiacomo.travaglini@arm.comElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,
76313481Sgiacomo.travaglini@arm.com    const T5& e5, const T6& e6, const T7& e7, const T8& e8, const T9& e9,
76413481Sgiacomo.travaglini@arm.com    const T10& e10) {
76513481Sgiacomo.travaglini@arm.com  typedef ::testing::tuple<
76613481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T1>::type,
76713481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T2>::type,
76813481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T3>::type,
76913481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T4>::type,
77013481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T5>::type,
77113481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T6>::type,
77213481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T7>::type,
77313481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T8>::type,
77413481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T9>::type,
77513481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T10>::type> Args;
77613481Sgiacomo.travaglini@arm.com  return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5, e6, e7,
77713481Sgiacomo.travaglini@arm.com      e8, e9, e10));
77813481Sgiacomo.travaglini@arm.com}
77913481Sgiacomo.travaglini@arm.com
78013481Sgiacomo.travaglini@arm.com// UnorderedElementsAre(e_1, e_2, ..., e_n) is an ElementsAre extension
78113481Sgiacomo.travaglini@arm.com// that matches n elements in any order.  We support up to n=10 arguments.
78213481Sgiacomo.travaglini@arm.com
78313481Sgiacomo.travaglini@arm.cominline internal::UnorderedElementsAreMatcher<
78413481Sgiacomo.travaglini@arm.com    ::testing::tuple<> >
78513481Sgiacomo.travaglini@arm.comUnorderedElementsAre() {
78613481Sgiacomo.travaglini@arm.com  typedef ::testing::tuple<> Args;
78713481Sgiacomo.travaglini@arm.com  return internal::UnorderedElementsAreMatcher<Args>(Args());
78813481Sgiacomo.travaglini@arm.com}
78913481Sgiacomo.travaglini@arm.com
79013481Sgiacomo.travaglini@arm.comtemplate <typename T1>
79113481Sgiacomo.travaglini@arm.cominline internal::UnorderedElementsAreMatcher<
79213481Sgiacomo.travaglini@arm.com    ::testing::tuple<
79313481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T1>::type> >
79413481Sgiacomo.travaglini@arm.comUnorderedElementsAre(const T1& e1) {
79513481Sgiacomo.travaglini@arm.com  typedef ::testing::tuple<
79613481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T1>::type> Args;
79713481Sgiacomo.travaglini@arm.com  return internal::UnorderedElementsAreMatcher<Args>(Args(e1));
79813481Sgiacomo.travaglini@arm.com}
79913481Sgiacomo.travaglini@arm.com
80013481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2>
80113481Sgiacomo.travaglini@arm.cominline internal::UnorderedElementsAreMatcher<
80213481Sgiacomo.travaglini@arm.com    ::testing::tuple<
80313481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T1>::type,
80413481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T2>::type> >
80513481Sgiacomo.travaglini@arm.comUnorderedElementsAre(const T1& e1, const T2& e2) {
80613481Sgiacomo.travaglini@arm.com  typedef ::testing::tuple<
80713481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T1>::type,
80813481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T2>::type> Args;
80913481Sgiacomo.travaglini@arm.com  return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2));
81013481Sgiacomo.travaglini@arm.com}
81113481Sgiacomo.travaglini@arm.com
81213481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3>
81313481Sgiacomo.travaglini@arm.cominline internal::UnorderedElementsAreMatcher<
81413481Sgiacomo.travaglini@arm.com    ::testing::tuple<
81513481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T1>::type,
81613481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T2>::type,
81713481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T3>::type> >
81813481Sgiacomo.travaglini@arm.comUnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3) {
81913481Sgiacomo.travaglini@arm.com  typedef ::testing::tuple<
82013481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T1>::type,
82113481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T2>::type,
82213481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T3>::type> Args;
82313481Sgiacomo.travaglini@arm.com  return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3));
82413481Sgiacomo.travaglini@arm.com}
82513481Sgiacomo.travaglini@arm.com
82613481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4>
82713481Sgiacomo.travaglini@arm.cominline internal::UnorderedElementsAreMatcher<
82813481Sgiacomo.travaglini@arm.com    ::testing::tuple<
82913481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T1>::type,
83013481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T2>::type,
83113481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T3>::type,
83213481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T4>::type> >
83313481Sgiacomo.travaglini@arm.comUnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4) {
83413481Sgiacomo.travaglini@arm.com  typedef ::testing::tuple<
83513481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T1>::type,
83613481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T2>::type,
83713481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T3>::type,
83813481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T4>::type> Args;
83913481Sgiacomo.travaglini@arm.com  return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3, e4));
84013481Sgiacomo.travaglini@arm.com}
84113481Sgiacomo.travaglini@arm.com
84213481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5>
84313481Sgiacomo.travaglini@arm.cominline internal::UnorderedElementsAreMatcher<
84413481Sgiacomo.travaglini@arm.com    ::testing::tuple<
84513481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T1>::type,
84613481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T2>::type,
84713481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T3>::type,
84813481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T4>::type,
84913481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T5>::type> >
85013481Sgiacomo.travaglini@arm.comUnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,
85113481Sgiacomo.travaglini@arm.com    const T5& e5) {
85213481Sgiacomo.travaglini@arm.com  typedef ::testing::tuple<
85313481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T1>::type,
85413481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T2>::type,
85513481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T3>::type,
85613481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T4>::type,
85713481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T5>::type> Args;
85813481Sgiacomo.travaglini@arm.com  return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5));
85913481Sgiacomo.travaglini@arm.com}
86013481Sgiacomo.travaglini@arm.com
86113481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
86213481Sgiacomo.travaglini@arm.com    typename T6>
86313481Sgiacomo.travaglini@arm.cominline internal::UnorderedElementsAreMatcher<
86413481Sgiacomo.travaglini@arm.com    ::testing::tuple<
86513481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T1>::type,
86613481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T2>::type,
86713481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T3>::type,
86813481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T4>::type,
86913481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T5>::type,
87013481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T6>::type> >
87113481Sgiacomo.travaglini@arm.comUnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,
87213481Sgiacomo.travaglini@arm.com    const T5& e5, const T6& e6) {
87313481Sgiacomo.travaglini@arm.com  typedef ::testing::tuple<
87413481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T1>::type,
87513481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T2>::type,
87613481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T3>::type,
87713481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T4>::type,
87813481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T5>::type,
87913481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T6>::type> Args;
88013481Sgiacomo.travaglini@arm.com  return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5,
88113481Sgiacomo.travaglini@arm.com      e6));
88213481Sgiacomo.travaglini@arm.com}
88313481Sgiacomo.travaglini@arm.com
88413481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
88513481Sgiacomo.travaglini@arm.com    typename T6, typename T7>
88613481Sgiacomo.travaglini@arm.cominline internal::UnorderedElementsAreMatcher<
88713481Sgiacomo.travaglini@arm.com    ::testing::tuple<
88813481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T1>::type,
88913481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T2>::type,
89013481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T3>::type,
89113481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T4>::type,
89213481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T5>::type,
89313481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T6>::type,
89413481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T7>::type> >
89513481Sgiacomo.travaglini@arm.comUnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,
89613481Sgiacomo.travaglini@arm.com    const T5& e5, const T6& e6, const T7& e7) {
89713481Sgiacomo.travaglini@arm.com  typedef ::testing::tuple<
89813481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T1>::type,
89913481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T2>::type,
90013481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T3>::type,
90113481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T4>::type,
90213481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T5>::type,
90313481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T6>::type,
90413481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T7>::type> Args;
90513481Sgiacomo.travaglini@arm.com  return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5,
90613481Sgiacomo.travaglini@arm.com      e6, e7));
90713481Sgiacomo.travaglini@arm.com}
90813481Sgiacomo.travaglini@arm.com
90913481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
91013481Sgiacomo.travaglini@arm.com    typename T6, typename T7, typename T8>
91113481Sgiacomo.travaglini@arm.cominline internal::UnorderedElementsAreMatcher<
91213481Sgiacomo.travaglini@arm.com    ::testing::tuple<
91313481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T1>::type,
91413481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T2>::type,
91513481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T3>::type,
91613481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T4>::type,
91713481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T5>::type,
91813481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T6>::type,
91913481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T7>::type,
92013481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T8>::type> >
92113481Sgiacomo.travaglini@arm.comUnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,
92213481Sgiacomo.travaglini@arm.com    const T5& e5, const T6& e6, const T7& e7, const T8& e8) {
92313481Sgiacomo.travaglini@arm.com  typedef ::testing::tuple<
92413481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T1>::type,
92513481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T2>::type,
92613481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T3>::type,
92713481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T4>::type,
92813481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T5>::type,
92913481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T6>::type,
93013481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T7>::type,
93113481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T8>::type> Args;
93213481Sgiacomo.travaglini@arm.com  return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5,
93313481Sgiacomo.travaglini@arm.com      e6, e7, e8));
93413481Sgiacomo.travaglini@arm.com}
93513481Sgiacomo.travaglini@arm.com
93613481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
93713481Sgiacomo.travaglini@arm.com    typename T6, typename T7, typename T8, typename T9>
93813481Sgiacomo.travaglini@arm.cominline internal::UnorderedElementsAreMatcher<
93913481Sgiacomo.travaglini@arm.com    ::testing::tuple<
94013481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T1>::type,
94113481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T2>::type,
94213481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T3>::type,
94313481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T4>::type,
94413481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T5>::type,
94513481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T6>::type,
94613481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T7>::type,
94713481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T8>::type,
94813481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T9>::type> >
94913481Sgiacomo.travaglini@arm.comUnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,
95013481Sgiacomo.travaglini@arm.com    const T5& e5, const T6& e6, const T7& e7, const T8& e8, const T9& e9) {
95113481Sgiacomo.travaglini@arm.com  typedef ::testing::tuple<
95213481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T1>::type,
95313481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T2>::type,
95413481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T3>::type,
95513481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T4>::type,
95613481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T5>::type,
95713481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T6>::type,
95813481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T7>::type,
95913481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T8>::type,
96013481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T9>::type> Args;
96113481Sgiacomo.travaglini@arm.com  return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5,
96213481Sgiacomo.travaglini@arm.com      e6, e7, e8, e9));
96313481Sgiacomo.travaglini@arm.com}
96413481Sgiacomo.travaglini@arm.com
96513481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
96613481Sgiacomo.travaglini@arm.com    typename T6, typename T7, typename T8, typename T9, typename T10>
96713481Sgiacomo.travaglini@arm.cominline internal::UnorderedElementsAreMatcher<
96813481Sgiacomo.travaglini@arm.com    ::testing::tuple<
96913481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T1>::type,
97013481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T2>::type,
97113481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T3>::type,
97213481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T4>::type,
97313481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T5>::type,
97413481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T6>::type,
97513481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T7>::type,
97613481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T8>::type,
97713481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T9>::type,
97813481Sgiacomo.travaglini@arm.com        typename internal::DecayArray<T10>::type> >
97913481Sgiacomo.travaglini@arm.comUnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,
98013481Sgiacomo.travaglini@arm.com    const T5& e5, const T6& e6, const T7& e7, const T8& e8, const T9& e9,
98113481Sgiacomo.travaglini@arm.com    const T10& e10) {
98213481Sgiacomo.travaglini@arm.com  typedef ::testing::tuple<
98313481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T1>::type,
98413481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T2>::type,
98513481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T3>::type,
98613481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T4>::type,
98713481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T5>::type,
98813481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T6>::type,
98913481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T7>::type,
99013481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T8>::type,
99113481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T9>::type,
99213481Sgiacomo.travaglini@arm.com      typename internal::DecayArray<T10>::type> Args;
99313481Sgiacomo.travaglini@arm.com  return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5,
99413481Sgiacomo.travaglini@arm.com      e6, e7, e8, e9, e10));
99513481Sgiacomo.travaglini@arm.com}
99613481Sgiacomo.travaglini@arm.com
99713481Sgiacomo.travaglini@arm.com// AllOf(m1, m2, ..., mk) matches any value that matches all of the given
99813481Sgiacomo.travaglini@arm.com// sub-matchers.  AllOf is called fully qualified to prevent ADL from firing.
99913481Sgiacomo.travaglini@arm.com
100013481Sgiacomo.travaglini@arm.comtemplate <typename M1, typename M2>
100113481Sgiacomo.travaglini@arm.cominline typename internal::AllOfResult2<M1, M2>::type
100213481Sgiacomo.travaglini@arm.comAllOf(M1 m1, M2 m2) {
100313481Sgiacomo.travaglini@arm.com  return typename internal::AllOfResult2<M1, M2>::type(
100413481Sgiacomo.travaglini@arm.com      m1,
100513481Sgiacomo.travaglini@arm.com      m2);
100613481Sgiacomo.travaglini@arm.com}
100713481Sgiacomo.travaglini@arm.com
100813481Sgiacomo.travaglini@arm.comtemplate <typename M1, typename M2, typename M3>
100913481Sgiacomo.travaglini@arm.cominline typename internal::AllOfResult3<M1, M2, M3>::type
101013481Sgiacomo.travaglini@arm.comAllOf(M1 m1, M2 m2, M3 m3) {
101113481Sgiacomo.travaglini@arm.com  return typename internal::AllOfResult3<M1, M2, M3>::type(
101213481Sgiacomo.travaglini@arm.com      m1,
101313481Sgiacomo.travaglini@arm.com      ::testing::AllOf(m2, m3));
101413481Sgiacomo.travaglini@arm.com}
101513481Sgiacomo.travaglini@arm.com
101613481Sgiacomo.travaglini@arm.comtemplate <typename M1, typename M2, typename M3, typename M4>
101713481Sgiacomo.travaglini@arm.cominline typename internal::AllOfResult4<M1, M2, M3, M4>::type
101813481Sgiacomo.travaglini@arm.comAllOf(M1 m1, M2 m2, M3 m3, M4 m4) {
101913481Sgiacomo.travaglini@arm.com  return typename internal::AllOfResult4<M1, M2, M3, M4>::type(
102013481Sgiacomo.travaglini@arm.com      ::testing::AllOf(m1, m2),
102113481Sgiacomo.travaglini@arm.com      ::testing::AllOf(m3, m4));
102213481Sgiacomo.travaglini@arm.com}
102313481Sgiacomo.travaglini@arm.com
102413481Sgiacomo.travaglini@arm.comtemplate <typename M1, typename M2, typename M3, typename M4, typename M5>
102513481Sgiacomo.travaglini@arm.cominline typename internal::AllOfResult5<M1, M2, M3, M4, M5>::type
102613481Sgiacomo.travaglini@arm.comAllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5) {
102713481Sgiacomo.travaglini@arm.com  return typename internal::AllOfResult5<M1, M2, M3, M4, M5>::type(
102813481Sgiacomo.travaglini@arm.com      ::testing::AllOf(m1, m2),
102913481Sgiacomo.travaglini@arm.com      ::testing::AllOf(m3, m4, m5));
103013481Sgiacomo.travaglini@arm.com}
103113481Sgiacomo.travaglini@arm.com
103213481Sgiacomo.travaglini@arm.comtemplate <typename M1, typename M2, typename M3, typename M4, typename M5,
103313481Sgiacomo.travaglini@arm.com    typename M6>
103413481Sgiacomo.travaglini@arm.cominline typename internal::AllOfResult6<M1, M2, M3, M4, M5, M6>::type
103513481Sgiacomo.travaglini@arm.comAllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6) {
103613481Sgiacomo.travaglini@arm.com  return typename internal::AllOfResult6<M1, M2, M3, M4, M5, M6>::type(
103713481Sgiacomo.travaglini@arm.com      ::testing::AllOf(m1, m2, m3),
103813481Sgiacomo.travaglini@arm.com      ::testing::AllOf(m4, m5, m6));
103913481Sgiacomo.travaglini@arm.com}
104013481Sgiacomo.travaglini@arm.com
104113481Sgiacomo.travaglini@arm.comtemplate <typename M1, typename M2, typename M3, typename M4, typename M5,
104213481Sgiacomo.travaglini@arm.com    typename M6, typename M7>
104313481Sgiacomo.travaglini@arm.cominline typename internal::AllOfResult7<M1, M2, M3, M4, M5, M6, M7>::type
104413481Sgiacomo.travaglini@arm.comAllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7) {
104513481Sgiacomo.travaglini@arm.com  return typename internal::AllOfResult7<M1, M2, M3, M4, M5, M6, M7>::type(
104613481Sgiacomo.travaglini@arm.com      ::testing::AllOf(m1, m2, m3),
104713481Sgiacomo.travaglini@arm.com      ::testing::AllOf(m4, m5, m6, m7));
104813481Sgiacomo.travaglini@arm.com}
104913481Sgiacomo.travaglini@arm.com
105013481Sgiacomo.travaglini@arm.comtemplate <typename M1, typename M2, typename M3, typename M4, typename M5,
105113481Sgiacomo.travaglini@arm.com    typename M6, typename M7, typename M8>
105213481Sgiacomo.travaglini@arm.cominline typename internal::AllOfResult8<M1, M2, M3, M4, M5, M6, M7, M8>::type
105313481Sgiacomo.travaglini@arm.comAllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8) {
105413481Sgiacomo.travaglini@arm.com  return typename internal::AllOfResult8<M1, M2, M3, M4, M5, M6, M7, M8>::type(
105513481Sgiacomo.travaglini@arm.com      ::testing::AllOf(m1, m2, m3, m4),
105613481Sgiacomo.travaglini@arm.com      ::testing::AllOf(m5, m6, m7, m8));
105713481Sgiacomo.travaglini@arm.com}
105813481Sgiacomo.travaglini@arm.com
105913481Sgiacomo.travaglini@arm.comtemplate <typename M1, typename M2, typename M3, typename M4, typename M5,
106013481Sgiacomo.travaglini@arm.com    typename M6, typename M7, typename M8, typename M9>
106113481Sgiacomo.travaglini@arm.cominline typename internal::AllOfResult9<M1, M2, M3, M4, M5, M6, M7, M8, M9>::type
106213481Sgiacomo.travaglini@arm.comAllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9) {
106313481Sgiacomo.travaglini@arm.com  return typename internal::AllOfResult9<M1, M2, M3, M4, M5, M6, M7, M8,
106413481Sgiacomo.travaglini@arm.com      M9>::type(
106513481Sgiacomo.travaglini@arm.com      ::testing::AllOf(m1, m2, m3, m4),
106613481Sgiacomo.travaglini@arm.com      ::testing::AllOf(m5, m6, m7, m8, m9));
106713481Sgiacomo.travaglini@arm.com}
106813481Sgiacomo.travaglini@arm.com
106913481Sgiacomo.travaglini@arm.comtemplate <typename M1, typename M2, typename M3, typename M4, typename M5,
107013481Sgiacomo.travaglini@arm.com    typename M6, typename M7, typename M8, typename M9, typename M10>
107113481Sgiacomo.travaglini@arm.cominline typename internal::AllOfResult10<M1, M2, M3, M4, M5, M6, M7, M8, M9,
107213481Sgiacomo.travaglini@arm.com    M10>::type
107313481Sgiacomo.travaglini@arm.comAllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {
107413481Sgiacomo.travaglini@arm.com  return typename internal::AllOfResult10<M1, M2, M3, M4, M5, M6, M7, M8, M9,
107513481Sgiacomo.travaglini@arm.com      M10>::type(
107613481Sgiacomo.travaglini@arm.com      ::testing::AllOf(m1, m2, m3, m4, m5),
107713481Sgiacomo.travaglini@arm.com      ::testing::AllOf(m6, m7, m8, m9, m10));
107813481Sgiacomo.travaglini@arm.com}
107913481Sgiacomo.travaglini@arm.com
108013481Sgiacomo.travaglini@arm.com// AnyOf(m1, m2, ..., mk) matches any value that matches any of the given
108113481Sgiacomo.travaglini@arm.com// sub-matchers.  AnyOf is called fully qualified to prevent ADL from firing.
108213481Sgiacomo.travaglini@arm.com
108313481Sgiacomo.travaglini@arm.comtemplate <typename M1, typename M2>
108413481Sgiacomo.travaglini@arm.cominline typename internal::AnyOfResult2<M1, M2>::type
108513481Sgiacomo.travaglini@arm.comAnyOf(M1 m1, M2 m2) {
108613481Sgiacomo.travaglini@arm.com  return typename internal::AnyOfResult2<M1, M2>::type(
108713481Sgiacomo.travaglini@arm.com      m1,
108813481Sgiacomo.travaglini@arm.com      m2);
108913481Sgiacomo.travaglini@arm.com}
109013481Sgiacomo.travaglini@arm.com
109113481Sgiacomo.travaglini@arm.comtemplate <typename M1, typename M2, typename M3>
109213481Sgiacomo.travaglini@arm.cominline typename internal::AnyOfResult3<M1, M2, M3>::type
109313481Sgiacomo.travaglini@arm.comAnyOf(M1 m1, M2 m2, M3 m3) {
109413481Sgiacomo.travaglini@arm.com  return typename internal::AnyOfResult3<M1, M2, M3>::type(
109513481Sgiacomo.travaglini@arm.com      m1,
109613481Sgiacomo.travaglini@arm.com      ::testing::AnyOf(m2, m3));
109713481Sgiacomo.travaglini@arm.com}
109813481Sgiacomo.travaglini@arm.com
109913481Sgiacomo.travaglini@arm.comtemplate <typename M1, typename M2, typename M3, typename M4>
110013481Sgiacomo.travaglini@arm.cominline typename internal::AnyOfResult4<M1, M2, M3, M4>::type
110113481Sgiacomo.travaglini@arm.comAnyOf(M1 m1, M2 m2, M3 m3, M4 m4) {
110213481Sgiacomo.travaglini@arm.com  return typename internal::AnyOfResult4<M1, M2, M3, M4>::type(
110313481Sgiacomo.travaglini@arm.com      ::testing::AnyOf(m1, m2),
110413481Sgiacomo.travaglini@arm.com      ::testing::AnyOf(m3, m4));
110513481Sgiacomo.travaglini@arm.com}
110613481Sgiacomo.travaglini@arm.com
110713481Sgiacomo.travaglini@arm.comtemplate <typename M1, typename M2, typename M3, typename M4, typename M5>
110813481Sgiacomo.travaglini@arm.cominline typename internal::AnyOfResult5<M1, M2, M3, M4, M5>::type
110913481Sgiacomo.travaglini@arm.comAnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5) {
111013481Sgiacomo.travaglini@arm.com  return typename internal::AnyOfResult5<M1, M2, M3, M4, M5>::type(
111113481Sgiacomo.travaglini@arm.com      ::testing::AnyOf(m1, m2),
111213481Sgiacomo.travaglini@arm.com      ::testing::AnyOf(m3, m4, m5));
111313481Sgiacomo.travaglini@arm.com}
111413481Sgiacomo.travaglini@arm.com
111513481Sgiacomo.travaglini@arm.comtemplate <typename M1, typename M2, typename M3, typename M4, typename M5,
111613481Sgiacomo.travaglini@arm.com    typename M6>
111713481Sgiacomo.travaglini@arm.cominline typename internal::AnyOfResult6<M1, M2, M3, M4, M5, M6>::type
111813481Sgiacomo.travaglini@arm.comAnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6) {
111913481Sgiacomo.travaglini@arm.com  return typename internal::AnyOfResult6<M1, M2, M3, M4, M5, M6>::type(
112013481Sgiacomo.travaglini@arm.com      ::testing::AnyOf(m1, m2, m3),
112113481Sgiacomo.travaglini@arm.com      ::testing::AnyOf(m4, m5, m6));
112213481Sgiacomo.travaglini@arm.com}
112313481Sgiacomo.travaglini@arm.com
112413481Sgiacomo.travaglini@arm.comtemplate <typename M1, typename M2, typename M3, typename M4, typename M5,
112513481Sgiacomo.travaglini@arm.com    typename M6, typename M7>
112613481Sgiacomo.travaglini@arm.cominline typename internal::AnyOfResult7<M1, M2, M3, M4, M5, M6, M7>::type
112713481Sgiacomo.travaglini@arm.comAnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7) {
112813481Sgiacomo.travaglini@arm.com  return typename internal::AnyOfResult7<M1, M2, M3, M4, M5, M6, M7>::type(
112913481Sgiacomo.travaglini@arm.com      ::testing::AnyOf(m1, m2, m3),
113013481Sgiacomo.travaglini@arm.com      ::testing::AnyOf(m4, m5, m6, m7));
113113481Sgiacomo.travaglini@arm.com}
113213481Sgiacomo.travaglini@arm.com
113313481Sgiacomo.travaglini@arm.comtemplate <typename M1, typename M2, typename M3, typename M4, typename M5,
113413481Sgiacomo.travaglini@arm.com    typename M6, typename M7, typename M8>
113513481Sgiacomo.travaglini@arm.cominline typename internal::AnyOfResult8<M1, M2, M3, M4, M5, M6, M7, M8>::type
113613481Sgiacomo.travaglini@arm.comAnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8) {
113713481Sgiacomo.travaglini@arm.com  return typename internal::AnyOfResult8<M1, M2, M3, M4, M5, M6, M7, M8>::type(
113813481Sgiacomo.travaglini@arm.com      ::testing::AnyOf(m1, m2, m3, m4),
113913481Sgiacomo.travaglini@arm.com      ::testing::AnyOf(m5, m6, m7, m8));
114013481Sgiacomo.travaglini@arm.com}
114113481Sgiacomo.travaglini@arm.com
114213481Sgiacomo.travaglini@arm.comtemplate <typename M1, typename M2, typename M3, typename M4, typename M5,
114313481Sgiacomo.travaglini@arm.com    typename M6, typename M7, typename M8, typename M9>
114413481Sgiacomo.travaglini@arm.cominline typename internal::AnyOfResult9<M1, M2, M3, M4, M5, M6, M7, M8, M9>::type
114513481Sgiacomo.travaglini@arm.comAnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9) {
114613481Sgiacomo.travaglini@arm.com  return typename internal::AnyOfResult9<M1, M2, M3, M4, M5, M6, M7, M8,
114713481Sgiacomo.travaglini@arm.com      M9>::type(
114813481Sgiacomo.travaglini@arm.com      ::testing::AnyOf(m1, m2, m3, m4),
114913481Sgiacomo.travaglini@arm.com      ::testing::AnyOf(m5, m6, m7, m8, m9));
115013481Sgiacomo.travaglini@arm.com}
115113481Sgiacomo.travaglini@arm.com
115213481Sgiacomo.travaglini@arm.comtemplate <typename M1, typename M2, typename M3, typename M4, typename M5,
115313481Sgiacomo.travaglini@arm.com    typename M6, typename M7, typename M8, typename M9, typename M10>
115413481Sgiacomo.travaglini@arm.cominline typename internal::AnyOfResult10<M1, M2, M3, M4, M5, M6, M7, M8, M9,
115513481Sgiacomo.travaglini@arm.com    M10>::type
115613481Sgiacomo.travaglini@arm.comAnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {
115713481Sgiacomo.travaglini@arm.com  return typename internal::AnyOfResult10<M1, M2, M3, M4, M5, M6, M7, M8, M9,
115813481Sgiacomo.travaglini@arm.com      M10>::type(
115913481Sgiacomo.travaglini@arm.com      ::testing::AnyOf(m1, m2, m3, m4, m5),
116013481Sgiacomo.travaglini@arm.com      ::testing::AnyOf(m6, m7, m8, m9, m10));
116113481Sgiacomo.travaglini@arm.com}
116213481Sgiacomo.travaglini@arm.com
116313481Sgiacomo.travaglini@arm.com}  // namespace testing
116413481Sgiacomo.travaglini@arm.com
116513481Sgiacomo.travaglini@arm.com
116613481Sgiacomo.travaglini@arm.com// The MATCHER* family of macros can be used in a namespace scope to
116713481Sgiacomo.travaglini@arm.com// define custom matchers easily.
116813481Sgiacomo.travaglini@arm.com//
116913481Sgiacomo.travaglini@arm.com// Basic Usage
117013481Sgiacomo.travaglini@arm.com// ===========
117113481Sgiacomo.travaglini@arm.com//
117213481Sgiacomo.travaglini@arm.com// The syntax
117313481Sgiacomo.travaglini@arm.com//
117413481Sgiacomo.travaglini@arm.com//   MATCHER(name, description_string) { statements; }
117513481Sgiacomo.travaglini@arm.com//
117613481Sgiacomo.travaglini@arm.com// defines a matcher with the given name that executes the statements,
117713481Sgiacomo.travaglini@arm.com// which must return a bool to indicate if the match succeeds.  Inside
117813481Sgiacomo.travaglini@arm.com// the statements, you can refer to the value being matched by 'arg',
117913481Sgiacomo.travaglini@arm.com// and refer to its type by 'arg_type'.
118013481Sgiacomo.travaglini@arm.com//
118113481Sgiacomo.travaglini@arm.com// The description string documents what the matcher does, and is used
118213481Sgiacomo.travaglini@arm.com// to generate the failure message when the match fails.  Since a
118313481Sgiacomo.travaglini@arm.com// MATCHER() is usually defined in a header file shared by multiple
118413481Sgiacomo.travaglini@arm.com// C++ source files, we require the description to be a C-string
118513481Sgiacomo.travaglini@arm.com// literal to avoid possible side effects.  It can be empty, in which
118613481Sgiacomo.travaglini@arm.com// case we'll use the sequence of words in the matcher name as the
118713481Sgiacomo.travaglini@arm.com// description.
118813481Sgiacomo.travaglini@arm.com//
118913481Sgiacomo.travaglini@arm.com// For example:
119013481Sgiacomo.travaglini@arm.com//
119113481Sgiacomo.travaglini@arm.com//   MATCHER(IsEven, "") { return (arg % 2) == 0; }
119213481Sgiacomo.travaglini@arm.com//
119313481Sgiacomo.travaglini@arm.com// allows you to write
119413481Sgiacomo.travaglini@arm.com//
119513481Sgiacomo.travaglini@arm.com//   // Expects mock_foo.Bar(n) to be called where n is even.
119613481Sgiacomo.travaglini@arm.com//   EXPECT_CALL(mock_foo, Bar(IsEven()));
119713481Sgiacomo.travaglini@arm.com//
119813481Sgiacomo.travaglini@arm.com// or,
119913481Sgiacomo.travaglini@arm.com//
120013481Sgiacomo.travaglini@arm.com//   // Verifies that the value of some_expression is even.
120113481Sgiacomo.travaglini@arm.com//   EXPECT_THAT(some_expression, IsEven());
120213481Sgiacomo.travaglini@arm.com//
120313481Sgiacomo.travaglini@arm.com// If the above assertion fails, it will print something like:
120413481Sgiacomo.travaglini@arm.com//
120513481Sgiacomo.travaglini@arm.com//   Value of: some_expression
120613481Sgiacomo.travaglini@arm.com//   Expected: is even
120713481Sgiacomo.travaglini@arm.com//     Actual: 7
120813481Sgiacomo.travaglini@arm.com//
120913481Sgiacomo.travaglini@arm.com// where the description "is even" is automatically calculated from the
121013481Sgiacomo.travaglini@arm.com// matcher name IsEven.
121113481Sgiacomo.travaglini@arm.com//
121213481Sgiacomo.travaglini@arm.com// Argument Type
121313481Sgiacomo.travaglini@arm.com// =============
121413481Sgiacomo.travaglini@arm.com//
121513481Sgiacomo.travaglini@arm.com// Note that the type of the value being matched (arg_type) is
121613481Sgiacomo.travaglini@arm.com// determined by the context in which you use the matcher and is
121713481Sgiacomo.travaglini@arm.com// supplied to you by the compiler, so you don't need to worry about
121813481Sgiacomo.travaglini@arm.com// declaring it (nor can you).  This allows the matcher to be
121913481Sgiacomo.travaglini@arm.com// polymorphic.  For example, IsEven() can be used to match any type
122013481Sgiacomo.travaglini@arm.com// where the value of "(arg % 2) == 0" can be implicitly converted to
122113481Sgiacomo.travaglini@arm.com// a bool.  In the "Bar(IsEven())" example above, if method Bar()
122213481Sgiacomo.travaglini@arm.com// takes an int, 'arg_type' will be int; if it takes an unsigned long,
122313481Sgiacomo.travaglini@arm.com// 'arg_type' will be unsigned long; and so on.
122413481Sgiacomo.travaglini@arm.com//
122513481Sgiacomo.travaglini@arm.com// Parameterizing Matchers
122613481Sgiacomo.travaglini@arm.com// =======================
122713481Sgiacomo.travaglini@arm.com//
122813481Sgiacomo.travaglini@arm.com// Sometimes you'll want to parameterize the matcher.  For that you
122913481Sgiacomo.travaglini@arm.com// can use another macro:
123013481Sgiacomo.travaglini@arm.com//
123113481Sgiacomo.travaglini@arm.com//   MATCHER_P(name, param_name, description_string) { statements; }
123213481Sgiacomo.travaglini@arm.com//
123313481Sgiacomo.travaglini@arm.com// For example:
123413481Sgiacomo.travaglini@arm.com//
123513481Sgiacomo.travaglini@arm.com//   MATCHER_P(HasAbsoluteValue, value, "") { return abs(arg) == value; }
123613481Sgiacomo.travaglini@arm.com//
123713481Sgiacomo.travaglini@arm.com// will allow you to write:
123813481Sgiacomo.travaglini@arm.com//
123913481Sgiacomo.travaglini@arm.com//   EXPECT_THAT(Blah("a"), HasAbsoluteValue(n));
124013481Sgiacomo.travaglini@arm.com//
124113481Sgiacomo.travaglini@arm.com// which may lead to this message (assuming n is 10):
124213481Sgiacomo.travaglini@arm.com//
124313481Sgiacomo.travaglini@arm.com//   Value of: Blah("a")
124413481Sgiacomo.travaglini@arm.com//   Expected: has absolute value 10
124513481Sgiacomo.travaglini@arm.com//     Actual: -9
124613481Sgiacomo.travaglini@arm.com//
124713481Sgiacomo.travaglini@arm.com// Note that both the matcher description and its parameter are
124813481Sgiacomo.travaglini@arm.com// printed, making the message human-friendly.
124913481Sgiacomo.travaglini@arm.com//
125013481Sgiacomo.travaglini@arm.com// In the matcher definition body, you can write 'foo_type' to
125113481Sgiacomo.travaglini@arm.com// reference the type of a parameter named 'foo'.  For example, in the
125213481Sgiacomo.travaglini@arm.com// body of MATCHER_P(HasAbsoluteValue, value) above, you can write
125313481Sgiacomo.travaglini@arm.com// 'value_type' to refer to the type of 'value'.
125413481Sgiacomo.travaglini@arm.com//
125513481Sgiacomo.travaglini@arm.com// We also provide MATCHER_P2, MATCHER_P3, ..., up to MATCHER_P10 to
125613481Sgiacomo.travaglini@arm.com// support multi-parameter matchers.
125713481Sgiacomo.travaglini@arm.com//
125813481Sgiacomo.travaglini@arm.com// Describing Parameterized Matchers
125913481Sgiacomo.travaglini@arm.com// =================================
126013481Sgiacomo.travaglini@arm.com//
126113481Sgiacomo.travaglini@arm.com// The last argument to MATCHER*() is a string-typed expression.  The
126213481Sgiacomo.travaglini@arm.com// expression can reference all of the matcher's parameters and a
126313481Sgiacomo.travaglini@arm.com// special bool-typed variable named 'negation'.  When 'negation' is
126413481Sgiacomo.travaglini@arm.com// false, the expression should evaluate to the matcher's description;
126513481Sgiacomo.travaglini@arm.com// otherwise it should evaluate to the description of the negation of
126613481Sgiacomo.travaglini@arm.com// the matcher.  For example,
126713481Sgiacomo.travaglini@arm.com//
126813481Sgiacomo.travaglini@arm.com//   using testing::PrintToString;
126913481Sgiacomo.travaglini@arm.com//
127013481Sgiacomo.travaglini@arm.com//   MATCHER_P2(InClosedRange, low, hi,
127113481Sgiacomo.travaglini@arm.com//       string(negation ? "is not" : "is") + " in range [" +
127213481Sgiacomo.travaglini@arm.com//       PrintToString(low) + ", " + PrintToString(hi) + "]") {
127313481Sgiacomo.travaglini@arm.com//     return low <= arg && arg <= hi;
127413481Sgiacomo.travaglini@arm.com//   }
127513481Sgiacomo.travaglini@arm.com//   ...
127613481Sgiacomo.travaglini@arm.com//   EXPECT_THAT(3, InClosedRange(4, 6));
127713481Sgiacomo.travaglini@arm.com//   EXPECT_THAT(3, Not(InClosedRange(2, 4)));
127813481Sgiacomo.travaglini@arm.com//
127913481Sgiacomo.travaglini@arm.com// would generate two failures that contain the text:
128013481Sgiacomo.travaglini@arm.com//
128113481Sgiacomo.travaglini@arm.com//   Expected: is in range [4, 6]
128213481Sgiacomo.travaglini@arm.com//   ...
128313481Sgiacomo.travaglini@arm.com//   Expected: is not in range [2, 4]
128413481Sgiacomo.travaglini@arm.com//
128513481Sgiacomo.travaglini@arm.com// If you specify "" as the description, the failure message will
128613481Sgiacomo.travaglini@arm.com// contain the sequence of words in the matcher name followed by the
128713481Sgiacomo.travaglini@arm.com// parameter values printed as a tuple.  For example,
128813481Sgiacomo.travaglini@arm.com//
128913481Sgiacomo.travaglini@arm.com//   MATCHER_P2(InClosedRange, low, hi, "") { ... }
129013481Sgiacomo.travaglini@arm.com//   ...
129113481Sgiacomo.travaglini@arm.com//   EXPECT_THAT(3, InClosedRange(4, 6));
129213481Sgiacomo.travaglini@arm.com//   EXPECT_THAT(3, Not(InClosedRange(2, 4)));
129313481Sgiacomo.travaglini@arm.com//
129413481Sgiacomo.travaglini@arm.com// would generate two failures that contain the text:
129513481Sgiacomo.travaglini@arm.com//
129613481Sgiacomo.travaglini@arm.com//   Expected: in closed range (4, 6)
129713481Sgiacomo.travaglini@arm.com//   ...
129813481Sgiacomo.travaglini@arm.com//   Expected: not (in closed range (2, 4))
129913481Sgiacomo.travaglini@arm.com//
130013481Sgiacomo.travaglini@arm.com// Types of Matcher Parameters
130113481Sgiacomo.travaglini@arm.com// ===========================
130213481Sgiacomo.travaglini@arm.com//
130313481Sgiacomo.travaglini@arm.com// For the purpose of typing, you can view
130413481Sgiacomo.travaglini@arm.com//
130513481Sgiacomo.travaglini@arm.com//   MATCHER_Pk(Foo, p1, ..., pk, description_string) { ... }
130613481Sgiacomo.travaglini@arm.com//
130713481Sgiacomo.travaglini@arm.com// as shorthand for
130813481Sgiacomo.travaglini@arm.com//
130913481Sgiacomo.travaglini@arm.com//   template <typename p1_type, ..., typename pk_type>
131013481Sgiacomo.travaglini@arm.com//   FooMatcherPk<p1_type, ..., pk_type>
131113481Sgiacomo.travaglini@arm.com//   Foo(p1_type p1, ..., pk_type pk) { ... }
131213481Sgiacomo.travaglini@arm.com//
131313481Sgiacomo.travaglini@arm.com// When you write Foo(v1, ..., vk), the compiler infers the types of
131413481Sgiacomo.travaglini@arm.com// the parameters v1, ..., and vk for you.  If you are not happy with
131513481Sgiacomo.travaglini@arm.com// the result of the type inference, you can specify the types by
131613481Sgiacomo.travaglini@arm.com// explicitly instantiating the template, as in Foo<long, bool>(5,
131713481Sgiacomo.travaglini@arm.com// false).  As said earlier, you don't get to (or need to) specify
131813481Sgiacomo.travaglini@arm.com// 'arg_type' as that's determined by the context in which the matcher
131913481Sgiacomo.travaglini@arm.com// is used.  You can assign the result of expression Foo(p1, ..., pk)
132013481Sgiacomo.travaglini@arm.com// to a variable of type FooMatcherPk<p1_type, ..., pk_type>.  This
132113481Sgiacomo.travaglini@arm.com// can be useful when composing matchers.
132213481Sgiacomo.travaglini@arm.com//
132313481Sgiacomo.travaglini@arm.com// While you can instantiate a matcher template with reference types,
132413481Sgiacomo.travaglini@arm.com// passing the parameters by pointer usually makes your code more
132513481Sgiacomo.travaglini@arm.com// readable.  If, however, you still want to pass a parameter by
132613481Sgiacomo.travaglini@arm.com// reference, be aware that in the failure message generated by the
132713481Sgiacomo.travaglini@arm.com// matcher you will see the value of the referenced object but not its
132813481Sgiacomo.travaglini@arm.com// address.
132913481Sgiacomo.travaglini@arm.com//
133013481Sgiacomo.travaglini@arm.com// Explaining Match Results
133113481Sgiacomo.travaglini@arm.com// ========================
133213481Sgiacomo.travaglini@arm.com//
133313481Sgiacomo.travaglini@arm.com// Sometimes the matcher description alone isn't enough to explain why
133413481Sgiacomo.travaglini@arm.com// the match has failed or succeeded.  For example, when expecting a
133513481Sgiacomo.travaglini@arm.com// long string, it can be very helpful to also print the diff between
133613481Sgiacomo.travaglini@arm.com// the expected string and the actual one.  To achieve that, you can
133713481Sgiacomo.travaglini@arm.com// optionally stream additional information to a special variable
133813481Sgiacomo.travaglini@arm.com// named result_listener, whose type is a pointer to class
133913481Sgiacomo.travaglini@arm.com// MatchResultListener:
134013481Sgiacomo.travaglini@arm.com//
134113481Sgiacomo.travaglini@arm.com//   MATCHER_P(EqualsLongString, str, "") {
134213481Sgiacomo.travaglini@arm.com//     if (arg == str) return true;
134313481Sgiacomo.travaglini@arm.com//
134413481Sgiacomo.travaglini@arm.com//     *result_listener << "the difference: "
134513481Sgiacomo.travaglini@arm.com///                     << DiffStrings(str, arg);
134613481Sgiacomo.travaglini@arm.com//     return false;
134713481Sgiacomo.travaglini@arm.com//   }
134813481Sgiacomo.travaglini@arm.com//
134913481Sgiacomo.travaglini@arm.com// Overloading Matchers
135013481Sgiacomo.travaglini@arm.com// ====================
135113481Sgiacomo.travaglini@arm.com//
135213481Sgiacomo.travaglini@arm.com// You can overload matchers with different numbers of parameters:
135313481Sgiacomo.travaglini@arm.com//
135413481Sgiacomo.travaglini@arm.com//   MATCHER_P(Blah, a, description_string1) { ... }
135513481Sgiacomo.travaglini@arm.com//   MATCHER_P2(Blah, a, b, description_string2) { ... }
135613481Sgiacomo.travaglini@arm.com//
135713481Sgiacomo.travaglini@arm.com// Caveats
135813481Sgiacomo.travaglini@arm.com// =======
135913481Sgiacomo.travaglini@arm.com//
136013481Sgiacomo.travaglini@arm.com// When defining a new matcher, you should also consider implementing
136113481Sgiacomo.travaglini@arm.com// MatcherInterface or using MakePolymorphicMatcher().  These
136213481Sgiacomo.travaglini@arm.com// approaches require more work than the MATCHER* macros, but also
136313481Sgiacomo.travaglini@arm.com// give you more control on the types of the value being matched and
136413481Sgiacomo.travaglini@arm.com// the matcher parameters, which may leads to better compiler error
136513481Sgiacomo.travaglini@arm.com// messages when the matcher is used wrong.  They also allow
136613481Sgiacomo.travaglini@arm.com// overloading matchers based on parameter types (as opposed to just
136713481Sgiacomo.travaglini@arm.com// based on the number of parameters).
136813481Sgiacomo.travaglini@arm.com//
136913481Sgiacomo.travaglini@arm.com// MATCHER*() can only be used in a namespace scope.  The reason is
137013481Sgiacomo.travaglini@arm.com// that C++ doesn't yet allow function-local types to be used to
137113481Sgiacomo.travaglini@arm.com// instantiate templates.  The up-coming C++0x standard will fix this.
137213481Sgiacomo.travaglini@arm.com// Once that's done, we'll consider supporting using MATCHER*() inside
137313481Sgiacomo.travaglini@arm.com// a function.
137413481Sgiacomo.travaglini@arm.com//
137513481Sgiacomo.travaglini@arm.com// More Information
137613481Sgiacomo.travaglini@arm.com// ================
137713481Sgiacomo.travaglini@arm.com//
137813481Sgiacomo.travaglini@arm.com// To learn more about using these macros, please search for 'MATCHER'
137913481Sgiacomo.travaglini@arm.com// on http://code.google.com/p/googlemock/wiki/CookBook.
138013481Sgiacomo.travaglini@arm.com
138113481Sgiacomo.travaglini@arm.com#define MATCHER(name, description)\
138213481Sgiacomo.travaglini@arm.com  class name##Matcher {\
138313481Sgiacomo.travaglini@arm.com   public:\
138413481Sgiacomo.travaglini@arm.com    template <typename arg_type>\
138513481Sgiacomo.travaglini@arm.com    class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\
138613481Sgiacomo.travaglini@arm.com     public:\
138713481Sgiacomo.travaglini@arm.com      gmock_Impl()\
138813481Sgiacomo.travaglini@arm.com           {}\
138913481Sgiacomo.travaglini@arm.com      virtual bool MatchAndExplain(\
139013481Sgiacomo.travaglini@arm.com          arg_type arg, ::testing::MatchResultListener* result_listener) const;\
139113481Sgiacomo.travaglini@arm.com      virtual void DescribeTo(::std::ostream* gmock_os) const {\
139213481Sgiacomo.travaglini@arm.com        *gmock_os << FormatDescription(false);\
139313481Sgiacomo.travaglini@arm.com      }\
139413481Sgiacomo.travaglini@arm.com      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
139513481Sgiacomo.travaglini@arm.com        *gmock_os << FormatDescription(true);\
139613481Sgiacomo.travaglini@arm.com      }\
139713481Sgiacomo.travaglini@arm.com     private:\
139813481Sgiacomo.travaglini@arm.com      ::testing::internal::string FormatDescription(bool negation) const {\
139913481Sgiacomo.travaglini@arm.com        const ::testing::internal::string gmock_description = (description);\
140013481Sgiacomo.travaglini@arm.com        if (!gmock_description.empty())\
140113481Sgiacomo.travaglini@arm.com          return gmock_description;\
140213481Sgiacomo.travaglini@arm.com        return ::testing::internal::FormatMatcherDescription(\
140313481Sgiacomo.travaglini@arm.com            negation, #name, \
140413481Sgiacomo.travaglini@arm.com            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
140513481Sgiacomo.travaglini@arm.com                ::testing::tuple<>()));\
140613481Sgiacomo.travaglini@arm.com      }\
140713481Sgiacomo.travaglini@arm.com      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
140813481Sgiacomo.travaglini@arm.com    };\
140913481Sgiacomo.travaglini@arm.com    template <typename arg_type>\
141013481Sgiacomo.travaglini@arm.com    operator ::testing::Matcher<arg_type>() const {\
141113481Sgiacomo.travaglini@arm.com      return ::testing::Matcher<arg_type>(\
141213481Sgiacomo.travaglini@arm.com          new gmock_Impl<arg_type>());\
141313481Sgiacomo.travaglini@arm.com    }\
141413481Sgiacomo.travaglini@arm.com    name##Matcher() {\
141513481Sgiacomo.travaglini@arm.com    }\
141613481Sgiacomo.travaglini@arm.com   private:\
141713481Sgiacomo.travaglini@arm.com    GTEST_DISALLOW_ASSIGN_(name##Matcher);\
141813481Sgiacomo.travaglini@arm.com  };\
141913481Sgiacomo.travaglini@arm.com  inline name##Matcher name() {\
142013481Sgiacomo.travaglini@arm.com    return name##Matcher();\
142113481Sgiacomo.travaglini@arm.com  }\
142213481Sgiacomo.travaglini@arm.com  template <typename arg_type>\
142313481Sgiacomo.travaglini@arm.com  bool name##Matcher::gmock_Impl<arg_type>::MatchAndExplain(\
142413481Sgiacomo.travaglini@arm.com      arg_type arg, \
142513481Sgiacomo.travaglini@arm.com      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
142613481Sgiacomo.travaglini@arm.com          const
142713481Sgiacomo.travaglini@arm.com
142813481Sgiacomo.travaglini@arm.com#define MATCHER_P(name, p0, description)\
142913481Sgiacomo.travaglini@arm.com  template <typename p0##_type>\
143013481Sgiacomo.travaglini@arm.com  class name##MatcherP {\
143113481Sgiacomo.travaglini@arm.com   public:\
143213481Sgiacomo.travaglini@arm.com    template <typename arg_type>\
143313481Sgiacomo.travaglini@arm.com    class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\
143413481Sgiacomo.travaglini@arm.com     public:\
143513481Sgiacomo.travaglini@arm.com      explicit gmock_Impl(p0##_type gmock_p0)\
143613481Sgiacomo.travaglini@arm.com           : p0(gmock_p0) {}\
143713481Sgiacomo.travaglini@arm.com      virtual bool MatchAndExplain(\
143813481Sgiacomo.travaglini@arm.com          arg_type arg, ::testing::MatchResultListener* result_listener) const;\
143913481Sgiacomo.travaglini@arm.com      virtual void DescribeTo(::std::ostream* gmock_os) const {\
144013481Sgiacomo.travaglini@arm.com        *gmock_os << FormatDescription(false);\
144113481Sgiacomo.travaglini@arm.com      }\
144213481Sgiacomo.travaglini@arm.com      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
144313481Sgiacomo.travaglini@arm.com        *gmock_os << FormatDescription(true);\
144413481Sgiacomo.travaglini@arm.com      }\
144513481Sgiacomo.travaglini@arm.com      p0##_type p0;\
144613481Sgiacomo.travaglini@arm.com     private:\
144713481Sgiacomo.travaglini@arm.com      ::testing::internal::string FormatDescription(bool negation) const {\
144813481Sgiacomo.travaglini@arm.com        const ::testing::internal::string gmock_description = (description);\
144913481Sgiacomo.travaglini@arm.com        if (!gmock_description.empty())\
145013481Sgiacomo.travaglini@arm.com          return gmock_description;\
145113481Sgiacomo.travaglini@arm.com        return ::testing::internal::FormatMatcherDescription(\
145213481Sgiacomo.travaglini@arm.com            negation, #name, \
145313481Sgiacomo.travaglini@arm.com            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
145413481Sgiacomo.travaglini@arm.com                ::testing::tuple<p0##_type>(p0)));\
145513481Sgiacomo.travaglini@arm.com      }\
145613481Sgiacomo.travaglini@arm.com      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
145713481Sgiacomo.travaglini@arm.com    };\
145813481Sgiacomo.travaglini@arm.com    template <typename arg_type>\
145913481Sgiacomo.travaglini@arm.com    operator ::testing::Matcher<arg_type>() const {\
146013481Sgiacomo.travaglini@arm.com      return ::testing::Matcher<arg_type>(\
146113481Sgiacomo.travaglini@arm.com          new gmock_Impl<arg_type>(p0));\
146213481Sgiacomo.travaglini@arm.com    }\
146313481Sgiacomo.travaglini@arm.com    explicit name##MatcherP(p0##_type gmock_p0) : p0(gmock_p0) {\
146413481Sgiacomo.travaglini@arm.com    }\
146513481Sgiacomo.travaglini@arm.com    p0##_type p0;\
146613481Sgiacomo.travaglini@arm.com   private:\
146713481Sgiacomo.travaglini@arm.com    GTEST_DISALLOW_ASSIGN_(name##MatcherP);\
146813481Sgiacomo.travaglini@arm.com  };\
146913481Sgiacomo.travaglini@arm.com  template <typename p0##_type>\
147013481Sgiacomo.travaglini@arm.com  inline name##MatcherP<p0##_type> name(p0##_type p0) {\
147113481Sgiacomo.travaglini@arm.com    return name##MatcherP<p0##_type>(p0);\
147213481Sgiacomo.travaglini@arm.com  }\
147313481Sgiacomo.travaglini@arm.com  template <typename p0##_type>\
147413481Sgiacomo.travaglini@arm.com  template <typename arg_type>\
147513481Sgiacomo.travaglini@arm.com  bool name##MatcherP<p0##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
147613481Sgiacomo.travaglini@arm.com      arg_type arg, \
147713481Sgiacomo.travaglini@arm.com      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
147813481Sgiacomo.travaglini@arm.com          const
147913481Sgiacomo.travaglini@arm.com
148013481Sgiacomo.travaglini@arm.com#define MATCHER_P2(name, p0, p1, description)\
148113481Sgiacomo.travaglini@arm.com  template <typename p0##_type, typename p1##_type>\
148213481Sgiacomo.travaglini@arm.com  class name##MatcherP2 {\
148313481Sgiacomo.travaglini@arm.com   public:\
148413481Sgiacomo.travaglini@arm.com    template <typename arg_type>\
148513481Sgiacomo.travaglini@arm.com    class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\
148613481Sgiacomo.travaglini@arm.com     public:\
148713481Sgiacomo.travaglini@arm.com      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1)\
148813481Sgiacomo.travaglini@arm.com           : p0(gmock_p0), p1(gmock_p1) {}\
148913481Sgiacomo.travaglini@arm.com      virtual bool MatchAndExplain(\
149013481Sgiacomo.travaglini@arm.com          arg_type arg, ::testing::MatchResultListener* result_listener) const;\
149113481Sgiacomo.travaglini@arm.com      virtual void DescribeTo(::std::ostream* gmock_os) const {\
149213481Sgiacomo.travaglini@arm.com        *gmock_os << FormatDescription(false);\
149313481Sgiacomo.travaglini@arm.com      }\
149413481Sgiacomo.travaglini@arm.com      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
149513481Sgiacomo.travaglini@arm.com        *gmock_os << FormatDescription(true);\
149613481Sgiacomo.travaglini@arm.com      }\
149713481Sgiacomo.travaglini@arm.com      p0##_type p0;\
149813481Sgiacomo.travaglini@arm.com      p1##_type p1;\
149913481Sgiacomo.travaglini@arm.com     private:\
150013481Sgiacomo.travaglini@arm.com      ::testing::internal::string FormatDescription(bool negation) const {\
150113481Sgiacomo.travaglini@arm.com        const ::testing::internal::string gmock_description = (description);\
150213481Sgiacomo.travaglini@arm.com        if (!gmock_description.empty())\
150313481Sgiacomo.travaglini@arm.com          return gmock_description;\
150413481Sgiacomo.travaglini@arm.com        return ::testing::internal::FormatMatcherDescription(\
150513481Sgiacomo.travaglini@arm.com            negation, #name, \
150613481Sgiacomo.travaglini@arm.com            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
150713481Sgiacomo.travaglini@arm.com                ::testing::tuple<p0##_type, p1##_type>(p0, p1)));\
150813481Sgiacomo.travaglini@arm.com      }\
150913481Sgiacomo.travaglini@arm.com      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
151013481Sgiacomo.travaglini@arm.com    };\
151113481Sgiacomo.travaglini@arm.com    template <typename arg_type>\
151213481Sgiacomo.travaglini@arm.com    operator ::testing::Matcher<arg_type>() const {\
151313481Sgiacomo.travaglini@arm.com      return ::testing::Matcher<arg_type>(\
151413481Sgiacomo.travaglini@arm.com          new gmock_Impl<arg_type>(p0, p1));\
151513481Sgiacomo.travaglini@arm.com    }\
151613481Sgiacomo.travaglini@arm.com    name##MatcherP2(p0##_type gmock_p0, p1##_type gmock_p1) : p0(gmock_p0), \
151713481Sgiacomo.travaglini@arm.com        p1(gmock_p1) {\
151813481Sgiacomo.travaglini@arm.com    }\
151913481Sgiacomo.travaglini@arm.com    p0##_type p0;\
152013481Sgiacomo.travaglini@arm.com    p1##_type p1;\
152113481Sgiacomo.travaglini@arm.com   private:\
152213481Sgiacomo.travaglini@arm.com    GTEST_DISALLOW_ASSIGN_(name##MatcherP2);\
152313481Sgiacomo.travaglini@arm.com  };\
152413481Sgiacomo.travaglini@arm.com  template <typename p0##_type, typename p1##_type>\
152513481Sgiacomo.travaglini@arm.com  inline name##MatcherP2<p0##_type, p1##_type> name(p0##_type p0, \
152613481Sgiacomo.travaglini@arm.com      p1##_type p1) {\
152713481Sgiacomo.travaglini@arm.com    return name##MatcherP2<p0##_type, p1##_type>(p0, p1);\
152813481Sgiacomo.travaglini@arm.com  }\
152913481Sgiacomo.travaglini@arm.com  template <typename p0##_type, typename p1##_type>\
153013481Sgiacomo.travaglini@arm.com  template <typename arg_type>\
153113481Sgiacomo.travaglini@arm.com  bool name##MatcherP2<p0##_type, \
153213481Sgiacomo.travaglini@arm.com      p1##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
153313481Sgiacomo.travaglini@arm.com      arg_type arg, \
153413481Sgiacomo.travaglini@arm.com      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
153513481Sgiacomo.travaglini@arm.com          const
153613481Sgiacomo.travaglini@arm.com
153713481Sgiacomo.travaglini@arm.com#define MATCHER_P3(name, p0, p1, p2, description)\
153813481Sgiacomo.travaglini@arm.com  template <typename p0##_type, typename p1##_type, typename p2##_type>\
153913481Sgiacomo.travaglini@arm.com  class name##MatcherP3 {\
154013481Sgiacomo.travaglini@arm.com   public:\
154113481Sgiacomo.travaglini@arm.com    template <typename arg_type>\
154213481Sgiacomo.travaglini@arm.com    class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\
154313481Sgiacomo.travaglini@arm.com     public:\
154413481Sgiacomo.travaglini@arm.com      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2)\
154513481Sgiacomo.travaglini@arm.com           : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2) {}\
154613481Sgiacomo.travaglini@arm.com      virtual bool MatchAndExplain(\
154713481Sgiacomo.travaglini@arm.com          arg_type arg, ::testing::MatchResultListener* result_listener) const;\
154813481Sgiacomo.travaglini@arm.com      virtual void DescribeTo(::std::ostream* gmock_os) const {\
154913481Sgiacomo.travaglini@arm.com        *gmock_os << FormatDescription(false);\
155013481Sgiacomo.travaglini@arm.com      }\
155113481Sgiacomo.travaglini@arm.com      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
155213481Sgiacomo.travaglini@arm.com        *gmock_os << FormatDescription(true);\
155313481Sgiacomo.travaglini@arm.com      }\
155413481Sgiacomo.travaglini@arm.com      p0##_type p0;\
155513481Sgiacomo.travaglini@arm.com      p1##_type p1;\
155613481Sgiacomo.travaglini@arm.com      p2##_type p2;\
155713481Sgiacomo.travaglini@arm.com     private:\
155813481Sgiacomo.travaglini@arm.com      ::testing::internal::string FormatDescription(bool negation) const {\
155913481Sgiacomo.travaglini@arm.com        const ::testing::internal::string gmock_description = (description);\
156013481Sgiacomo.travaglini@arm.com        if (!gmock_description.empty())\
156113481Sgiacomo.travaglini@arm.com          return gmock_description;\
156213481Sgiacomo.travaglini@arm.com        return ::testing::internal::FormatMatcherDescription(\
156313481Sgiacomo.travaglini@arm.com            negation, #name, \
156413481Sgiacomo.travaglini@arm.com            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
156513481Sgiacomo.travaglini@arm.com                ::testing::tuple<p0##_type, p1##_type, p2##_type>(p0, p1, \
156613481Sgiacomo.travaglini@arm.com                    p2)));\
156713481Sgiacomo.travaglini@arm.com      }\
156813481Sgiacomo.travaglini@arm.com      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
156913481Sgiacomo.travaglini@arm.com    };\
157013481Sgiacomo.travaglini@arm.com    template <typename arg_type>\
157113481Sgiacomo.travaglini@arm.com    operator ::testing::Matcher<arg_type>() const {\
157213481Sgiacomo.travaglini@arm.com      return ::testing::Matcher<arg_type>(\
157313481Sgiacomo.travaglini@arm.com          new gmock_Impl<arg_type>(p0, p1, p2));\
157413481Sgiacomo.travaglini@arm.com    }\
157513481Sgiacomo.travaglini@arm.com    name##MatcherP3(p0##_type gmock_p0, p1##_type gmock_p1, \
157613481Sgiacomo.travaglini@arm.com        p2##_type gmock_p2) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2) {\
157713481Sgiacomo.travaglini@arm.com    }\
157813481Sgiacomo.travaglini@arm.com    p0##_type p0;\
157913481Sgiacomo.travaglini@arm.com    p1##_type p1;\
158013481Sgiacomo.travaglini@arm.com    p2##_type p2;\
158113481Sgiacomo.travaglini@arm.com   private:\
158213481Sgiacomo.travaglini@arm.com    GTEST_DISALLOW_ASSIGN_(name##MatcherP3);\
158313481Sgiacomo.travaglini@arm.com  };\
158413481Sgiacomo.travaglini@arm.com  template <typename p0##_type, typename p1##_type, typename p2##_type>\
158513481Sgiacomo.travaglini@arm.com  inline name##MatcherP3<p0##_type, p1##_type, p2##_type> name(p0##_type p0, \
158613481Sgiacomo.travaglini@arm.com      p1##_type p1, p2##_type p2) {\
158713481Sgiacomo.travaglini@arm.com    return name##MatcherP3<p0##_type, p1##_type, p2##_type>(p0, p1, p2);\
158813481Sgiacomo.travaglini@arm.com  }\
158913481Sgiacomo.travaglini@arm.com  template <typename p0##_type, typename p1##_type, typename p2##_type>\
159013481Sgiacomo.travaglini@arm.com  template <typename arg_type>\
159113481Sgiacomo.travaglini@arm.com  bool name##MatcherP3<p0##_type, p1##_type, \
159213481Sgiacomo.travaglini@arm.com      p2##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
159313481Sgiacomo.travaglini@arm.com      arg_type arg, \
159413481Sgiacomo.travaglini@arm.com      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
159513481Sgiacomo.travaglini@arm.com          const
159613481Sgiacomo.travaglini@arm.com
159713481Sgiacomo.travaglini@arm.com#define MATCHER_P4(name, p0, p1, p2, p3, description)\
159813481Sgiacomo.travaglini@arm.com  template <typename p0##_type, typename p1##_type, typename p2##_type, \
159913481Sgiacomo.travaglini@arm.com      typename p3##_type>\
160013481Sgiacomo.travaglini@arm.com  class name##MatcherP4 {\
160113481Sgiacomo.travaglini@arm.com   public:\
160213481Sgiacomo.travaglini@arm.com    template <typename arg_type>\
160313481Sgiacomo.travaglini@arm.com    class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\
160413481Sgiacomo.travaglini@arm.com     public:\
160513481Sgiacomo.travaglini@arm.com      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
160613481Sgiacomo.travaglini@arm.com          p3##_type gmock_p3)\
160713481Sgiacomo.travaglini@arm.com           : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3) {}\
160813481Sgiacomo.travaglini@arm.com      virtual bool MatchAndExplain(\
160913481Sgiacomo.travaglini@arm.com          arg_type arg, ::testing::MatchResultListener* result_listener) const;\
161013481Sgiacomo.travaglini@arm.com      virtual void DescribeTo(::std::ostream* gmock_os) const {\
161113481Sgiacomo.travaglini@arm.com        *gmock_os << FormatDescription(false);\
161213481Sgiacomo.travaglini@arm.com      }\
161313481Sgiacomo.travaglini@arm.com      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
161413481Sgiacomo.travaglini@arm.com        *gmock_os << FormatDescription(true);\
161513481Sgiacomo.travaglini@arm.com      }\
161613481Sgiacomo.travaglini@arm.com      p0##_type p0;\
161713481Sgiacomo.travaglini@arm.com      p1##_type p1;\
161813481Sgiacomo.travaglini@arm.com      p2##_type p2;\
161913481Sgiacomo.travaglini@arm.com      p3##_type p3;\
162013481Sgiacomo.travaglini@arm.com     private:\
162113481Sgiacomo.travaglini@arm.com      ::testing::internal::string FormatDescription(bool negation) const {\
162213481Sgiacomo.travaglini@arm.com        const ::testing::internal::string gmock_description = (description);\
162313481Sgiacomo.travaglini@arm.com        if (!gmock_description.empty())\
162413481Sgiacomo.travaglini@arm.com          return gmock_description;\
162513481Sgiacomo.travaglini@arm.com        return ::testing::internal::FormatMatcherDescription(\
162613481Sgiacomo.travaglini@arm.com            negation, #name, \
162713481Sgiacomo.travaglini@arm.com            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
162813481Sgiacomo.travaglini@arm.com                ::testing::tuple<p0##_type, p1##_type, p2##_type, \
162913481Sgiacomo.travaglini@arm.com                    p3##_type>(p0, p1, p2, p3)));\
163013481Sgiacomo.travaglini@arm.com      }\
163113481Sgiacomo.travaglini@arm.com      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
163213481Sgiacomo.travaglini@arm.com    };\
163313481Sgiacomo.travaglini@arm.com    template <typename arg_type>\
163413481Sgiacomo.travaglini@arm.com    operator ::testing::Matcher<arg_type>() const {\
163513481Sgiacomo.travaglini@arm.com      return ::testing::Matcher<arg_type>(\
163613481Sgiacomo.travaglini@arm.com          new gmock_Impl<arg_type>(p0, p1, p2, p3));\
163713481Sgiacomo.travaglini@arm.com    }\
163813481Sgiacomo.travaglini@arm.com    name##MatcherP4(p0##_type gmock_p0, p1##_type gmock_p1, \
163913481Sgiacomo.travaglini@arm.com        p2##_type gmock_p2, p3##_type gmock_p3) : p0(gmock_p0), p1(gmock_p1), \
164013481Sgiacomo.travaglini@arm.com        p2(gmock_p2), p3(gmock_p3) {\
164113481Sgiacomo.travaglini@arm.com    }\
164213481Sgiacomo.travaglini@arm.com    p0##_type p0;\
164313481Sgiacomo.travaglini@arm.com    p1##_type p1;\
164413481Sgiacomo.travaglini@arm.com    p2##_type p2;\
164513481Sgiacomo.travaglini@arm.com    p3##_type p3;\
164613481Sgiacomo.travaglini@arm.com   private:\
164713481Sgiacomo.travaglini@arm.com    GTEST_DISALLOW_ASSIGN_(name##MatcherP4);\
164813481Sgiacomo.travaglini@arm.com  };\
164913481Sgiacomo.travaglini@arm.com  template <typename p0##_type, typename p1##_type, typename p2##_type, \
165013481Sgiacomo.travaglini@arm.com      typename p3##_type>\
165113481Sgiacomo.travaglini@arm.com  inline name##MatcherP4<p0##_type, p1##_type, p2##_type, \
165213481Sgiacomo.travaglini@arm.com      p3##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, \
165313481Sgiacomo.travaglini@arm.com      p3##_type p3) {\
165413481Sgiacomo.travaglini@arm.com    return name##MatcherP4<p0##_type, p1##_type, p2##_type, p3##_type>(p0, \
165513481Sgiacomo.travaglini@arm.com        p1, p2, p3);\
165613481Sgiacomo.travaglini@arm.com  }\
165713481Sgiacomo.travaglini@arm.com  template <typename p0##_type, typename p1##_type, typename p2##_type, \
165813481Sgiacomo.travaglini@arm.com      typename p3##_type>\
165913481Sgiacomo.travaglini@arm.com  template <typename arg_type>\
166013481Sgiacomo.travaglini@arm.com  bool name##MatcherP4<p0##_type, p1##_type, p2##_type, \
166113481Sgiacomo.travaglini@arm.com      p3##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
166213481Sgiacomo.travaglini@arm.com      arg_type arg, \
166313481Sgiacomo.travaglini@arm.com      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
166413481Sgiacomo.travaglini@arm.com          const
166513481Sgiacomo.travaglini@arm.com
166613481Sgiacomo.travaglini@arm.com#define MATCHER_P5(name, p0, p1, p2, p3, p4, description)\
166713481Sgiacomo.travaglini@arm.com  template <typename p0##_type, typename p1##_type, typename p2##_type, \
166813481Sgiacomo.travaglini@arm.com      typename p3##_type, typename p4##_type>\
166913481Sgiacomo.travaglini@arm.com  class name##MatcherP5 {\
167013481Sgiacomo.travaglini@arm.com   public:\
167113481Sgiacomo.travaglini@arm.com    template <typename arg_type>\
167213481Sgiacomo.travaglini@arm.com    class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\
167313481Sgiacomo.travaglini@arm.com     public:\
167413481Sgiacomo.travaglini@arm.com      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
167513481Sgiacomo.travaglini@arm.com          p3##_type gmock_p3, p4##_type gmock_p4)\
167613481Sgiacomo.travaglini@arm.com           : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \
167713481Sgiacomo.travaglini@arm.com               p4(gmock_p4) {}\
167813481Sgiacomo.travaglini@arm.com      virtual bool MatchAndExplain(\
167913481Sgiacomo.travaglini@arm.com          arg_type arg, ::testing::MatchResultListener* result_listener) const;\
168013481Sgiacomo.travaglini@arm.com      virtual void DescribeTo(::std::ostream* gmock_os) const {\
168113481Sgiacomo.travaglini@arm.com        *gmock_os << FormatDescription(false);\
168213481Sgiacomo.travaglini@arm.com      }\
168313481Sgiacomo.travaglini@arm.com      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
168413481Sgiacomo.travaglini@arm.com        *gmock_os << FormatDescription(true);\
168513481Sgiacomo.travaglini@arm.com      }\
168613481Sgiacomo.travaglini@arm.com      p0##_type p0;\
168713481Sgiacomo.travaglini@arm.com      p1##_type p1;\
168813481Sgiacomo.travaglini@arm.com      p2##_type p2;\
168913481Sgiacomo.travaglini@arm.com      p3##_type p3;\
169013481Sgiacomo.travaglini@arm.com      p4##_type p4;\
169113481Sgiacomo.travaglini@arm.com     private:\
169213481Sgiacomo.travaglini@arm.com      ::testing::internal::string FormatDescription(bool negation) const {\
169313481Sgiacomo.travaglini@arm.com        const ::testing::internal::string gmock_description = (description);\
169413481Sgiacomo.travaglini@arm.com        if (!gmock_description.empty())\
169513481Sgiacomo.travaglini@arm.com          return gmock_description;\
169613481Sgiacomo.travaglini@arm.com        return ::testing::internal::FormatMatcherDescription(\
169713481Sgiacomo.travaglini@arm.com            negation, #name, \
169813481Sgiacomo.travaglini@arm.com            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
169913481Sgiacomo.travaglini@arm.com                ::testing::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \
170013481Sgiacomo.travaglini@arm.com                    p4##_type>(p0, p1, p2, p3, p4)));\
170113481Sgiacomo.travaglini@arm.com      }\
170213481Sgiacomo.travaglini@arm.com      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
170313481Sgiacomo.travaglini@arm.com    };\
170413481Sgiacomo.travaglini@arm.com    template <typename arg_type>\
170513481Sgiacomo.travaglini@arm.com    operator ::testing::Matcher<arg_type>() const {\
170613481Sgiacomo.travaglini@arm.com      return ::testing::Matcher<arg_type>(\
170713481Sgiacomo.travaglini@arm.com          new gmock_Impl<arg_type>(p0, p1, p2, p3, p4));\
170813481Sgiacomo.travaglini@arm.com    }\
170913481Sgiacomo.travaglini@arm.com    name##MatcherP5(p0##_type gmock_p0, p1##_type gmock_p1, \
171013481Sgiacomo.travaglini@arm.com        p2##_type gmock_p2, p3##_type gmock_p3, \
171113481Sgiacomo.travaglini@arm.com        p4##_type gmock_p4) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
171213481Sgiacomo.travaglini@arm.com        p3(gmock_p3), p4(gmock_p4) {\
171313481Sgiacomo.travaglini@arm.com    }\
171413481Sgiacomo.travaglini@arm.com    p0##_type p0;\
171513481Sgiacomo.travaglini@arm.com    p1##_type p1;\
171613481Sgiacomo.travaglini@arm.com    p2##_type p2;\
171713481Sgiacomo.travaglini@arm.com    p3##_type p3;\
171813481Sgiacomo.travaglini@arm.com    p4##_type p4;\
171913481Sgiacomo.travaglini@arm.com   private:\
172013481Sgiacomo.travaglini@arm.com    GTEST_DISALLOW_ASSIGN_(name##MatcherP5);\
172113481Sgiacomo.travaglini@arm.com  };\
172213481Sgiacomo.travaglini@arm.com  template <typename p0##_type, typename p1##_type, typename p2##_type, \
172313481Sgiacomo.travaglini@arm.com      typename p3##_type, typename p4##_type>\
172413481Sgiacomo.travaglini@arm.com  inline name##MatcherP5<p0##_type, p1##_type, p2##_type, p3##_type, \
172513481Sgiacomo.travaglini@arm.com      p4##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \
172613481Sgiacomo.travaglini@arm.com      p4##_type p4) {\
172713481Sgiacomo.travaglini@arm.com    return name##MatcherP5<p0##_type, p1##_type, p2##_type, p3##_type, \
172813481Sgiacomo.travaglini@arm.com        p4##_type>(p0, p1, p2, p3, p4);\
172913481Sgiacomo.travaglini@arm.com  }\
173013481Sgiacomo.travaglini@arm.com  template <typename p0##_type, typename p1##_type, typename p2##_type, \
173113481Sgiacomo.travaglini@arm.com      typename p3##_type, typename p4##_type>\
173213481Sgiacomo.travaglini@arm.com  template <typename arg_type>\
173313481Sgiacomo.travaglini@arm.com  bool name##MatcherP5<p0##_type, p1##_type, p2##_type, p3##_type, \
173413481Sgiacomo.travaglini@arm.com      p4##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
173513481Sgiacomo.travaglini@arm.com      arg_type arg, \
173613481Sgiacomo.travaglini@arm.com      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
173713481Sgiacomo.travaglini@arm.com          const
173813481Sgiacomo.travaglini@arm.com
173913481Sgiacomo.travaglini@arm.com#define MATCHER_P6(name, p0, p1, p2, p3, p4, p5, description)\
174013481Sgiacomo.travaglini@arm.com  template <typename p0##_type, typename p1##_type, typename p2##_type, \
174113481Sgiacomo.travaglini@arm.com      typename p3##_type, typename p4##_type, typename p5##_type>\
174213481Sgiacomo.travaglini@arm.com  class name##MatcherP6 {\
174313481Sgiacomo.travaglini@arm.com   public:\
174413481Sgiacomo.travaglini@arm.com    template <typename arg_type>\
174513481Sgiacomo.travaglini@arm.com    class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\
174613481Sgiacomo.travaglini@arm.com     public:\
174713481Sgiacomo.travaglini@arm.com      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
174813481Sgiacomo.travaglini@arm.com          p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5)\
174913481Sgiacomo.travaglini@arm.com           : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \
175013481Sgiacomo.travaglini@arm.com               p4(gmock_p4), p5(gmock_p5) {}\
175113481Sgiacomo.travaglini@arm.com      virtual bool MatchAndExplain(\
175213481Sgiacomo.travaglini@arm.com          arg_type arg, ::testing::MatchResultListener* result_listener) const;\
175313481Sgiacomo.travaglini@arm.com      virtual void DescribeTo(::std::ostream* gmock_os) const {\
175413481Sgiacomo.travaglini@arm.com        *gmock_os << FormatDescription(false);\
175513481Sgiacomo.travaglini@arm.com      }\
175613481Sgiacomo.travaglini@arm.com      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
175713481Sgiacomo.travaglini@arm.com        *gmock_os << FormatDescription(true);\
175813481Sgiacomo.travaglini@arm.com      }\
175913481Sgiacomo.travaglini@arm.com      p0##_type p0;\
176013481Sgiacomo.travaglini@arm.com      p1##_type p1;\
176113481Sgiacomo.travaglini@arm.com      p2##_type p2;\
176213481Sgiacomo.travaglini@arm.com      p3##_type p3;\
176313481Sgiacomo.travaglini@arm.com      p4##_type p4;\
176413481Sgiacomo.travaglini@arm.com      p5##_type p5;\
176513481Sgiacomo.travaglini@arm.com     private:\
176613481Sgiacomo.travaglini@arm.com      ::testing::internal::string FormatDescription(bool negation) const {\
176713481Sgiacomo.travaglini@arm.com        const ::testing::internal::string gmock_description = (description);\
176813481Sgiacomo.travaglini@arm.com        if (!gmock_description.empty())\
176913481Sgiacomo.travaglini@arm.com          return gmock_description;\
177013481Sgiacomo.travaglini@arm.com        return ::testing::internal::FormatMatcherDescription(\
177113481Sgiacomo.travaglini@arm.com            negation, #name, \
177213481Sgiacomo.travaglini@arm.com            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
177313481Sgiacomo.travaglini@arm.com                ::testing::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \
177413481Sgiacomo.travaglini@arm.com                    p4##_type, p5##_type>(p0, p1, p2, p3, p4, p5)));\
177513481Sgiacomo.travaglini@arm.com      }\
177613481Sgiacomo.travaglini@arm.com      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
177713481Sgiacomo.travaglini@arm.com    };\
177813481Sgiacomo.travaglini@arm.com    template <typename arg_type>\
177913481Sgiacomo.travaglini@arm.com    operator ::testing::Matcher<arg_type>() const {\
178013481Sgiacomo.travaglini@arm.com      return ::testing::Matcher<arg_type>(\
178113481Sgiacomo.travaglini@arm.com          new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5));\
178213481Sgiacomo.travaglini@arm.com    }\
178313481Sgiacomo.travaglini@arm.com    name##MatcherP6(p0##_type gmock_p0, p1##_type gmock_p1, \
178413481Sgiacomo.travaglini@arm.com        p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
178513481Sgiacomo.travaglini@arm.com        p5##_type gmock_p5) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
178613481Sgiacomo.travaglini@arm.com        p3(gmock_p3), p4(gmock_p4), p5(gmock_p5) {\
178713481Sgiacomo.travaglini@arm.com    }\
178813481Sgiacomo.travaglini@arm.com    p0##_type p0;\
178913481Sgiacomo.travaglini@arm.com    p1##_type p1;\
179013481Sgiacomo.travaglini@arm.com    p2##_type p2;\
179113481Sgiacomo.travaglini@arm.com    p3##_type p3;\
179213481Sgiacomo.travaglini@arm.com    p4##_type p4;\
179313481Sgiacomo.travaglini@arm.com    p5##_type p5;\
179413481Sgiacomo.travaglini@arm.com   private:\
179513481Sgiacomo.travaglini@arm.com    GTEST_DISALLOW_ASSIGN_(name##MatcherP6);\
179613481Sgiacomo.travaglini@arm.com  };\
179713481Sgiacomo.travaglini@arm.com  template <typename p0##_type, typename p1##_type, typename p2##_type, \
179813481Sgiacomo.travaglini@arm.com      typename p3##_type, typename p4##_type, typename p5##_type>\
179913481Sgiacomo.travaglini@arm.com  inline name##MatcherP6<p0##_type, p1##_type, p2##_type, p3##_type, \
180013481Sgiacomo.travaglini@arm.com      p4##_type, p5##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, \
180113481Sgiacomo.travaglini@arm.com      p3##_type p3, p4##_type p4, p5##_type p5) {\
180213481Sgiacomo.travaglini@arm.com    return name##MatcherP6<p0##_type, p1##_type, p2##_type, p3##_type, \
180313481Sgiacomo.travaglini@arm.com        p4##_type, p5##_type>(p0, p1, p2, p3, p4, p5);\
180413481Sgiacomo.travaglini@arm.com  }\
180513481Sgiacomo.travaglini@arm.com  template <typename p0##_type, typename p1##_type, typename p2##_type, \
180613481Sgiacomo.travaglini@arm.com      typename p3##_type, typename p4##_type, typename p5##_type>\
180713481Sgiacomo.travaglini@arm.com  template <typename arg_type>\
180813481Sgiacomo.travaglini@arm.com  bool name##MatcherP6<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
180913481Sgiacomo.travaglini@arm.com      p5##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
181013481Sgiacomo.travaglini@arm.com      arg_type arg, \
181113481Sgiacomo.travaglini@arm.com      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
181213481Sgiacomo.travaglini@arm.com          const
181313481Sgiacomo.travaglini@arm.com
181413481Sgiacomo.travaglini@arm.com#define MATCHER_P7(name, p0, p1, p2, p3, p4, p5, p6, description)\
181513481Sgiacomo.travaglini@arm.com  template <typename p0##_type, typename p1##_type, typename p2##_type, \
181613481Sgiacomo.travaglini@arm.com      typename p3##_type, typename p4##_type, typename p5##_type, \
181713481Sgiacomo.travaglini@arm.com      typename p6##_type>\
181813481Sgiacomo.travaglini@arm.com  class name##MatcherP7 {\
181913481Sgiacomo.travaglini@arm.com   public:\
182013481Sgiacomo.travaglini@arm.com    template <typename arg_type>\
182113481Sgiacomo.travaglini@arm.com    class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\
182213481Sgiacomo.travaglini@arm.com     public:\
182313481Sgiacomo.travaglini@arm.com      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
182413481Sgiacomo.travaglini@arm.com          p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
182513481Sgiacomo.travaglini@arm.com          p6##_type gmock_p6)\
182613481Sgiacomo.travaglini@arm.com           : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \
182713481Sgiacomo.travaglini@arm.com               p4(gmock_p4), p5(gmock_p5), p6(gmock_p6) {}\
182813481Sgiacomo.travaglini@arm.com      virtual bool MatchAndExplain(\
182913481Sgiacomo.travaglini@arm.com          arg_type arg, ::testing::MatchResultListener* result_listener) const;\
183013481Sgiacomo.travaglini@arm.com      virtual void DescribeTo(::std::ostream* gmock_os) const {\
183113481Sgiacomo.travaglini@arm.com        *gmock_os << FormatDescription(false);\
183213481Sgiacomo.travaglini@arm.com      }\
183313481Sgiacomo.travaglini@arm.com      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
183413481Sgiacomo.travaglini@arm.com        *gmock_os << FormatDescription(true);\
183513481Sgiacomo.travaglini@arm.com      }\
183613481Sgiacomo.travaglini@arm.com      p0##_type p0;\
183713481Sgiacomo.travaglini@arm.com      p1##_type p1;\
183813481Sgiacomo.travaglini@arm.com      p2##_type p2;\
183913481Sgiacomo.travaglini@arm.com      p3##_type p3;\
184013481Sgiacomo.travaglini@arm.com      p4##_type p4;\
184113481Sgiacomo.travaglini@arm.com      p5##_type p5;\
184213481Sgiacomo.travaglini@arm.com      p6##_type p6;\
184313481Sgiacomo.travaglini@arm.com     private:\
184413481Sgiacomo.travaglini@arm.com      ::testing::internal::string FormatDescription(bool negation) const {\
184513481Sgiacomo.travaglini@arm.com        const ::testing::internal::string gmock_description = (description);\
184613481Sgiacomo.travaglini@arm.com        if (!gmock_description.empty())\
184713481Sgiacomo.travaglini@arm.com          return gmock_description;\
184813481Sgiacomo.travaglini@arm.com        return ::testing::internal::FormatMatcherDescription(\
184913481Sgiacomo.travaglini@arm.com            negation, #name, \
185013481Sgiacomo.travaglini@arm.com            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
185113481Sgiacomo.travaglini@arm.com                ::testing::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \
185213481Sgiacomo.travaglini@arm.com                    p4##_type, p5##_type, p6##_type>(p0, p1, p2, p3, p4, p5, \
185313481Sgiacomo.travaglini@arm.com                    p6)));\
185413481Sgiacomo.travaglini@arm.com      }\
185513481Sgiacomo.travaglini@arm.com      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
185613481Sgiacomo.travaglini@arm.com    };\
185713481Sgiacomo.travaglini@arm.com    template <typename arg_type>\
185813481Sgiacomo.travaglini@arm.com    operator ::testing::Matcher<arg_type>() const {\
185913481Sgiacomo.travaglini@arm.com      return ::testing::Matcher<arg_type>(\
186013481Sgiacomo.travaglini@arm.com          new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5, p6));\
186113481Sgiacomo.travaglini@arm.com    }\
186213481Sgiacomo.travaglini@arm.com    name##MatcherP7(p0##_type gmock_p0, p1##_type gmock_p1, \
186313481Sgiacomo.travaglini@arm.com        p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
186413481Sgiacomo.travaglini@arm.com        p5##_type gmock_p5, p6##_type gmock_p6) : p0(gmock_p0), p1(gmock_p1), \
186513481Sgiacomo.travaglini@arm.com        p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), \
186613481Sgiacomo.travaglini@arm.com        p6(gmock_p6) {\
186713481Sgiacomo.travaglini@arm.com    }\
186813481Sgiacomo.travaglini@arm.com    p0##_type p0;\
186913481Sgiacomo.travaglini@arm.com    p1##_type p1;\
187013481Sgiacomo.travaglini@arm.com    p2##_type p2;\
187113481Sgiacomo.travaglini@arm.com    p3##_type p3;\
187213481Sgiacomo.travaglini@arm.com    p4##_type p4;\
187313481Sgiacomo.travaglini@arm.com    p5##_type p5;\
187413481Sgiacomo.travaglini@arm.com    p6##_type p6;\
187513481Sgiacomo.travaglini@arm.com   private:\
187613481Sgiacomo.travaglini@arm.com    GTEST_DISALLOW_ASSIGN_(name##MatcherP7);\
187713481Sgiacomo.travaglini@arm.com  };\
187813481Sgiacomo.travaglini@arm.com  template <typename p0##_type, typename p1##_type, typename p2##_type, \
187913481Sgiacomo.travaglini@arm.com      typename p3##_type, typename p4##_type, typename p5##_type, \
188013481Sgiacomo.travaglini@arm.com      typename p6##_type>\
188113481Sgiacomo.travaglini@arm.com  inline name##MatcherP7<p0##_type, p1##_type, p2##_type, p3##_type, \
188213481Sgiacomo.travaglini@arm.com      p4##_type, p5##_type, p6##_type> name(p0##_type p0, p1##_type p1, \
188313481Sgiacomo.travaglini@arm.com      p2##_type p2, p3##_type p3, p4##_type p4, p5##_type p5, \
188413481Sgiacomo.travaglini@arm.com      p6##_type p6) {\
188513481Sgiacomo.travaglini@arm.com    return name##MatcherP7<p0##_type, p1##_type, p2##_type, p3##_type, \
188613481Sgiacomo.travaglini@arm.com        p4##_type, p5##_type, p6##_type>(p0, p1, p2, p3, p4, p5, p6);\
188713481Sgiacomo.travaglini@arm.com  }\
188813481Sgiacomo.travaglini@arm.com  template <typename p0##_type, typename p1##_type, typename p2##_type, \
188913481Sgiacomo.travaglini@arm.com      typename p3##_type, typename p4##_type, typename p5##_type, \
189013481Sgiacomo.travaglini@arm.com      typename p6##_type>\
189113481Sgiacomo.travaglini@arm.com  template <typename arg_type>\
189213481Sgiacomo.travaglini@arm.com  bool name##MatcherP7<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
189313481Sgiacomo.travaglini@arm.com      p5##_type, p6##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
189413481Sgiacomo.travaglini@arm.com      arg_type arg, \
189513481Sgiacomo.travaglini@arm.com      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
189613481Sgiacomo.travaglini@arm.com          const
189713481Sgiacomo.travaglini@arm.com
189813481Sgiacomo.travaglini@arm.com#define MATCHER_P8(name, p0, p1, p2, p3, p4, p5, p6, p7, description)\
189913481Sgiacomo.travaglini@arm.com  template <typename p0##_type, typename p1##_type, typename p2##_type, \
190013481Sgiacomo.travaglini@arm.com      typename p3##_type, typename p4##_type, typename p5##_type, \
190113481Sgiacomo.travaglini@arm.com      typename p6##_type, typename p7##_type>\
190213481Sgiacomo.travaglini@arm.com  class name##MatcherP8 {\
190313481Sgiacomo.travaglini@arm.com   public:\
190413481Sgiacomo.travaglini@arm.com    template <typename arg_type>\
190513481Sgiacomo.travaglini@arm.com    class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\
190613481Sgiacomo.travaglini@arm.com     public:\
190713481Sgiacomo.travaglini@arm.com      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
190813481Sgiacomo.travaglini@arm.com          p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
190913481Sgiacomo.travaglini@arm.com          p6##_type gmock_p6, p7##_type gmock_p7)\
191013481Sgiacomo.travaglini@arm.com           : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \
191113481Sgiacomo.travaglini@arm.com               p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7) {}\
191213481Sgiacomo.travaglini@arm.com      virtual bool MatchAndExplain(\
191313481Sgiacomo.travaglini@arm.com          arg_type arg, ::testing::MatchResultListener* result_listener) const;\
191413481Sgiacomo.travaglini@arm.com      virtual void DescribeTo(::std::ostream* gmock_os) const {\
191513481Sgiacomo.travaglini@arm.com        *gmock_os << FormatDescription(false);\
191613481Sgiacomo.travaglini@arm.com      }\
191713481Sgiacomo.travaglini@arm.com      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
191813481Sgiacomo.travaglini@arm.com        *gmock_os << FormatDescription(true);\
191913481Sgiacomo.travaglini@arm.com      }\
192013481Sgiacomo.travaglini@arm.com      p0##_type p0;\
192113481Sgiacomo.travaglini@arm.com      p1##_type p1;\
192213481Sgiacomo.travaglini@arm.com      p2##_type p2;\
192313481Sgiacomo.travaglini@arm.com      p3##_type p3;\
192413481Sgiacomo.travaglini@arm.com      p4##_type p4;\
192513481Sgiacomo.travaglini@arm.com      p5##_type p5;\
192613481Sgiacomo.travaglini@arm.com      p6##_type p6;\
192713481Sgiacomo.travaglini@arm.com      p7##_type p7;\
192813481Sgiacomo.travaglini@arm.com     private:\
192913481Sgiacomo.travaglini@arm.com      ::testing::internal::string FormatDescription(bool negation) const {\
193013481Sgiacomo.travaglini@arm.com        const ::testing::internal::string gmock_description = (description);\
193113481Sgiacomo.travaglini@arm.com        if (!gmock_description.empty())\
193213481Sgiacomo.travaglini@arm.com          return gmock_description;\
193313481Sgiacomo.travaglini@arm.com        return ::testing::internal::FormatMatcherDescription(\
193413481Sgiacomo.travaglini@arm.com            negation, #name, \
193513481Sgiacomo.travaglini@arm.com            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
193613481Sgiacomo.travaglini@arm.com                ::testing::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \
193713481Sgiacomo.travaglini@arm.com                    p4##_type, p5##_type, p6##_type, p7##_type>(p0, p1, p2, \
193813481Sgiacomo.travaglini@arm.com                    p3, p4, p5, p6, p7)));\
193913481Sgiacomo.travaglini@arm.com      }\
194013481Sgiacomo.travaglini@arm.com      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
194113481Sgiacomo.travaglini@arm.com    };\
194213481Sgiacomo.travaglini@arm.com    template <typename arg_type>\
194313481Sgiacomo.travaglini@arm.com    operator ::testing::Matcher<arg_type>() const {\
194413481Sgiacomo.travaglini@arm.com      return ::testing::Matcher<arg_type>(\
194513481Sgiacomo.travaglini@arm.com          new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5, p6, p7));\
194613481Sgiacomo.travaglini@arm.com    }\
194713481Sgiacomo.travaglini@arm.com    name##MatcherP8(p0##_type gmock_p0, p1##_type gmock_p1, \
194813481Sgiacomo.travaglini@arm.com        p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
194913481Sgiacomo.travaglini@arm.com        p5##_type gmock_p5, p6##_type gmock_p6, \
195013481Sgiacomo.travaglini@arm.com        p7##_type gmock_p7) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
195113481Sgiacomo.travaglini@arm.com        p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \
195213481Sgiacomo.travaglini@arm.com        p7(gmock_p7) {\
195313481Sgiacomo.travaglini@arm.com    }\
195413481Sgiacomo.travaglini@arm.com    p0##_type p0;\
195513481Sgiacomo.travaglini@arm.com    p1##_type p1;\
195613481Sgiacomo.travaglini@arm.com    p2##_type p2;\
195713481Sgiacomo.travaglini@arm.com    p3##_type p3;\
195813481Sgiacomo.travaglini@arm.com    p4##_type p4;\
195913481Sgiacomo.travaglini@arm.com    p5##_type p5;\
196013481Sgiacomo.travaglini@arm.com    p6##_type p6;\
196113481Sgiacomo.travaglini@arm.com    p7##_type p7;\
196213481Sgiacomo.travaglini@arm.com   private:\
196313481Sgiacomo.travaglini@arm.com    GTEST_DISALLOW_ASSIGN_(name##MatcherP8);\
196413481Sgiacomo.travaglini@arm.com  };\
196513481Sgiacomo.travaglini@arm.com  template <typename p0##_type, typename p1##_type, typename p2##_type, \
196613481Sgiacomo.travaglini@arm.com      typename p3##_type, typename p4##_type, typename p5##_type, \
196713481Sgiacomo.travaglini@arm.com      typename p6##_type, typename p7##_type>\
196813481Sgiacomo.travaglini@arm.com  inline name##MatcherP8<p0##_type, p1##_type, p2##_type, p3##_type, \
196913481Sgiacomo.travaglini@arm.com      p4##_type, p5##_type, p6##_type, p7##_type> name(p0##_type p0, \
197013481Sgiacomo.travaglini@arm.com      p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, p5##_type p5, \
197113481Sgiacomo.travaglini@arm.com      p6##_type p6, p7##_type p7) {\
197213481Sgiacomo.travaglini@arm.com    return name##MatcherP8<p0##_type, p1##_type, p2##_type, p3##_type, \
197313481Sgiacomo.travaglini@arm.com        p4##_type, p5##_type, p6##_type, p7##_type>(p0, p1, p2, p3, p4, p5, \
197413481Sgiacomo.travaglini@arm.com        p6, p7);\
197513481Sgiacomo.travaglini@arm.com  }\
197613481Sgiacomo.travaglini@arm.com  template <typename p0##_type, typename p1##_type, typename p2##_type, \
197713481Sgiacomo.travaglini@arm.com      typename p3##_type, typename p4##_type, typename p5##_type, \
197813481Sgiacomo.travaglini@arm.com      typename p6##_type, typename p7##_type>\
197913481Sgiacomo.travaglini@arm.com  template <typename arg_type>\
198013481Sgiacomo.travaglini@arm.com  bool name##MatcherP8<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
198113481Sgiacomo.travaglini@arm.com      p5##_type, p6##_type, \
198213481Sgiacomo.travaglini@arm.com      p7##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
198313481Sgiacomo.travaglini@arm.com      arg_type arg, \
198413481Sgiacomo.travaglini@arm.com      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
198513481Sgiacomo.travaglini@arm.com          const
198613481Sgiacomo.travaglini@arm.com
198713481Sgiacomo.travaglini@arm.com#define MATCHER_P9(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, description)\
198813481Sgiacomo.travaglini@arm.com  template <typename p0##_type, typename p1##_type, typename p2##_type, \
198913481Sgiacomo.travaglini@arm.com      typename p3##_type, typename p4##_type, typename p5##_type, \
199013481Sgiacomo.travaglini@arm.com      typename p6##_type, typename p7##_type, typename p8##_type>\
199113481Sgiacomo.travaglini@arm.com  class name##MatcherP9 {\
199213481Sgiacomo.travaglini@arm.com   public:\
199313481Sgiacomo.travaglini@arm.com    template <typename arg_type>\
199413481Sgiacomo.travaglini@arm.com    class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\
199513481Sgiacomo.travaglini@arm.com     public:\
199613481Sgiacomo.travaglini@arm.com      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
199713481Sgiacomo.travaglini@arm.com          p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
199813481Sgiacomo.travaglini@arm.com          p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8)\
199913481Sgiacomo.travaglini@arm.com           : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \
200013481Sgiacomo.travaglini@arm.com               p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \
200113481Sgiacomo.travaglini@arm.com               p8(gmock_p8) {}\
200213481Sgiacomo.travaglini@arm.com      virtual bool MatchAndExplain(\
200313481Sgiacomo.travaglini@arm.com          arg_type arg, ::testing::MatchResultListener* result_listener) const;\
200413481Sgiacomo.travaglini@arm.com      virtual void DescribeTo(::std::ostream* gmock_os) const {\
200513481Sgiacomo.travaglini@arm.com        *gmock_os << FormatDescription(false);\
200613481Sgiacomo.travaglini@arm.com      }\
200713481Sgiacomo.travaglini@arm.com      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
200813481Sgiacomo.travaglini@arm.com        *gmock_os << FormatDescription(true);\
200913481Sgiacomo.travaglini@arm.com      }\
201013481Sgiacomo.travaglini@arm.com      p0##_type p0;\
201113481Sgiacomo.travaglini@arm.com      p1##_type p1;\
201213481Sgiacomo.travaglini@arm.com      p2##_type p2;\
201313481Sgiacomo.travaglini@arm.com      p3##_type p3;\
201413481Sgiacomo.travaglini@arm.com      p4##_type p4;\
201513481Sgiacomo.travaglini@arm.com      p5##_type p5;\
201613481Sgiacomo.travaglini@arm.com      p6##_type p6;\
201713481Sgiacomo.travaglini@arm.com      p7##_type p7;\
201813481Sgiacomo.travaglini@arm.com      p8##_type p8;\
201913481Sgiacomo.travaglini@arm.com     private:\
202013481Sgiacomo.travaglini@arm.com      ::testing::internal::string FormatDescription(bool negation) const {\
202113481Sgiacomo.travaglini@arm.com        const ::testing::internal::string gmock_description = (description);\
202213481Sgiacomo.travaglini@arm.com        if (!gmock_description.empty())\
202313481Sgiacomo.travaglini@arm.com          return gmock_description;\
202413481Sgiacomo.travaglini@arm.com        return ::testing::internal::FormatMatcherDescription(\
202513481Sgiacomo.travaglini@arm.com            negation, #name, \
202613481Sgiacomo.travaglini@arm.com            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
202713481Sgiacomo.travaglini@arm.com                ::testing::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \
202813481Sgiacomo.travaglini@arm.com                    p4##_type, p5##_type, p6##_type, p7##_type, \
202913481Sgiacomo.travaglini@arm.com                    p8##_type>(p0, p1, p2, p3, p4, p5, p6, p7, p8)));\
203013481Sgiacomo.travaglini@arm.com      }\
203113481Sgiacomo.travaglini@arm.com      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
203213481Sgiacomo.travaglini@arm.com    };\
203313481Sgiacomo.travaglini@arm.com    template <typename arg_type>\
203413481Sgiacomo.travaglini@arm.com    operator ::testing::Matcher<arg_type>() const {\
203513481Sgiacomo.travaglini@arm.com      return ::testing::Matcher<arg_type>(\
203613481Sgiacomo.travaglini@arm.com          new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5, p6, p7, p8));\
203713481Sgiacomo.travaglini@arm.com    }\
203813481Sgiacomo.travaglini@arm.com    name##MatcherP9(p0##_type gmock_p0, p1##_type gmock_p1, \
203913481Sgiacomo.travaglini@arm.com        p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
204013481Sgiacomo.travaglini@arm.com        p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \
204113481Sgiacomo.travaglini@arm.com        p8##_type gmock_p8) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
204213481Sgiacomo.travaglini@arm.com        p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \
204313481Sgiacomo.travaglini@arm.com        p8(gmock_p8) {\
204413481Sgiacomo.travaglini@arm.com    }\
204513481Sgiacomo.travaglini@arm.com    p0##_type p0;\
204613481Sgiacomo.travaglini@arm.com    p1##_type p1;\
204713481Sgiacomo.travaglini@arm.com    p2##_type p2;\
204813481Sgiacomo.travaglini@arm.com    p3##_type p3;\
204913481Sgiacomo.travaglini@arm.com    p4##_type p4;\
205013481Sgiacomo.travaglini@arm.com    p5##_type p5;\
205113481Sgiacomo.travaglini@arm.com    p6##_type p6;\
205213481Sgiacomo.travaglini@arm.com    p7##_type p7;\
205313481Sgiacomo.travaglini@arm.com    p8##_type p8;\
205413481Sgiacomo.travaglini@arm.com   private:\
205513481Sgiacomo.travaglini@arm.com    GTEST_DISALLOW_ASSIGN_(name##MatcherP9);\
205613481Sgiacomo.travaglini@arm.com  };\
205713481Sgiacomo.travaglini@arm.com  template <typename p0##_type, typename p1##_type, typename p2##_type, \
205813481Sgiacomo.travaglini@arm.com      typename p3##_type, typename p4##_type, typename p5##_type, \
205913481Sgiacomo.travaglini@arm.com      typename p6##_type, typename p7##_type, typename p8##_type>\
206013481Sgiacomo.travaglini@arm.com  inline name##MatcherP9<p0##_type, p1##_type, p2##_type, p3##_type, \
206113481Sgiacomo.travaglini@arm.com      p4##_type, p5##_type, p6##_type, p7##_type, \
206213481Sgiacomo.travaglini@arm.com      p8##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \
206313481Sgiacomo.travaglini@arm.com      p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, \
206413481Sgiacomo.travaglini@arm.com      p8##_type p8) {\
206513481Sgiacomo.travaglini@arm.com    return name##MatcherP9<p0##_type, p1##_type, p2##_type, p3##_type, \
206613481Sgiacomo.travaglini@arm.com        p4##_type, p5##_type, p6##_type, p7##_type, p8##_type>(p0, p1, p2, \
206713481Sgiacomo.travaglini@arm.com        p3, p4, p5, p6, p7, p8);\
206813481Sgiacomo.travaglini@arm.com  }\
206913481Sgiacomo.travaglini@arm.com  template <typename p0##_type, typename p1##_type, typename p2##_type, \
207013481Sgiacomo.travaglini@arm.com      typename p3##_type, typename p4##_type, typename p5##_type, \
207113481Sgiacomo.travaglini@arm.com      typename p6##_type, typename p7##_type, typename p8##_type>\
207213481Sgiacomo.travaglini@arm.com  template <typename arg_type>\
207313481Sgiacomo.travaglini@arm.com  bool name##MatcherP9<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
207413481Sgiacomo.travaglini@arm.com      p5##_type, p6##_type, p7##_type, \
207513481Sgiacomo.travaglini@arm.com      p8##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
207613481Sgiacomo.travaglini@arm.com      arg_type arg, \
207713481Sgiacomo.travaglini@arm.com      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
207813481Sgiacomo.travaglini@arm.com          const
207913481Sgiacomo.travaglini@arm.com
208013481Sgiacomo.travaglini@arm.com#define MATCHER_P10(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, description)\
208113481Sgiacomo.travaglini@arm.com  template <typename p0##_type, typename p1##_type, typename p2##_type, \
208213481Sgiacomo.travaglini@arm.com      typename p3##_type, typename p4##_type, typename p5##_type, \
208313481Sgiacomo.travaglini@arm.com      typename p6##_type, typename p7##_type, typename p8##_type, \
208413481Sgiacomo.travaglini@arm.com      typename p9##_type>\
208513481Sgiacomo.travaglini@arm.com  class name##MatcherP10 {\
208613481Sgiacomo.travaglini@arm.com   public:\
208713481Sgiacomo.travaglini@arm.com    template <typename arg_type>\
208813481Sgiacomo.travaglini@arm.com    class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\
208913481Sgiacomo.travaglini@arm.com     public:\
209013481Sgiacomo.travaglini@arm.com      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
209113481Sgiacomo.travaglini@arm.com          p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
209213481Sgiacomo.travaglini@arm.com          p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8, \
209313481Sgiacomo.travaglini@arm.com          p9##_type gmock_p9)\
209413481Sgiacomo.travaglini@arm.com           : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \
209513481Sgiacomo.travaglini@arm.com               p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \
209613481Sgiacomo.travaglini@arm.com               p8(gmock_p8), p9(gmock_p9) {}\
209713481Sgiacomo.travaglini@arm.com      virtual bool MatchAndExplain(\
209813481Sgiacomo.travaglini@arm.com          arg_type arg, ::testing::MatchResultListener* result_listener) const;\
209913481Sgiacomo.travaglini@arm.com      virtual void DescribeTo(::std::ostream* gmock_os) const {\
210013481Sgiacomo.travaglini@arm.com        *gmock_os << FormatDescription(false);\
210113481Sgiacomo.travaglini@arm.com      }\
210213481Sgiacomo.travaglini@arm.com      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
210313481Sgiacomo.travaglini@arm.com        *gmock_os << FormatDescription(true);\
210413481Sgiacomo.travaglini@arm.com      }\
210513481Sgiacomo.travaglini@arm.com      p0##_type p0;\
210613481Sgiacomo.travaglini@arm.com      p1##_type p1;\
210713481Sgiacomo.travaglini@arm.com      p2##_type p2;\
210813481Sgiacomo.travaglini@arm.com      p3##_type p3;\
210913481Sgiacomo.travaglini@arm.com      p4##_type p4;\
211013481Sgiacomo.travaglini@arm.com      p5##_type p5;\
211113481Sgiacomo.travaglini@arm.com      p6##_type p6;\
211213481Sgiacomo.travaglini@arm.com      p7##_type p7;\
211313481Sgiacomo.travaglini@arm.com      p8##_type p8;\
211413481Sgiacomo.travaglini@arm.com      p9##_type p9;\
211513481Sgiacomo.travaglini@arm.com     private:\
211613481Sgiacomo.travaglini@arm.com      ::testing::internal::string FormatDescription(bool negation) const {\
211713481Sgiacomo.travaglini@arm.com        const ::testing::internal::string gmock_description = (description);\
211813481Sgiacomo.travaglini@arm.com        if (!gmock_description.empty())\
211913481Sgiacomo.travaglini@arm.com          return gmock_description;\
212013481Sgiacomo.travaglini@arm.com        return ::testing::internal::FormatMatcherDescription(\
212113481Sgiacomo.travaglini@arm.com            negation, #name, \
212213481Sgiacomo.travaglini@arm.com            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
212313481Sgiacomo.travaglini@arm.com                ::testing::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \
212413481Sgiacomo.travaglini@arm.com                    p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, \
212513481Sgiacomo.travaglini@arm.com                    p9##_type>(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)));\
212613481Sgiacomo.travaglini@arm.com      }\
212713481Sgiacomo.travaglini@arm.com      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
212813481Sgiacomo.travaglini@arm.com    };\
212913481Sgiacomo.travaglini@arm.com    template <typename arg_type>\
213013481Sgiacomo.travaglini@arm.com    operator ::testing::Matcher<arg_type>() const {\
213113481Sgiacomo.travaglini@arm.com      return ::testing::Matcher<arg_type>(\
213213481Sgiacomo.travaglini@arm.com          new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9));\
213313481Sgiacomo.travaglini@arm.com    }\
213413481Sgiacomo.travaglini@arm.com    name##MatcherP10(p0##_type gmock_p0, p1##_type gmock_p1, \
213513481Sgiacomo.travaglini@arm.com        p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
213613481Sgiacomo.travaglini@arm.com        p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \
213713481Sgiacomo.travaglini@arm.com        p8##_type gmock_p8, p9##_type gmock_p9) : p0(gmock_p0), p1(gmock_p1), \
213813481Sgiacomo.travaglini@arm.com        p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \
213913481Sgiacomo.travaglini@arm.com        p7(gmock_p7), p8(gmock_p8), p9(gmock_p9) {\
214013481Sgiacomo.travaglini@arm.com    }\
214113481Sgiacomo.travaglini@arm.com    p0##_type p0;\
214213481Sgiacomo.travaglini@arm.com    p1##_type p1;\
214313481Sgiacomo.travaglini@arm.com    p2##_type p2;\
214413481Sgiacomo.travaglini@arm.com    p3##_type p3;\
214513481Sgiacomo.travaglini@arm.com    p4##_type p4;\
214613481Sgiacomo.travaglini@arm.com    p5##_type p5;\
214713481Sgiacomo.travaglini@arm.com    p6##_type p6;\
214813481Sgiacomo.travaglini@arm.com    p7##_type p7;\
214913481Sgiacomo.travaglini@arm.com    p8##_type p8;\
215013481Sgiacomo.travaglini@arm.com    p9##_type p9;\
215113481Sgiacomo.travaglini@arm.com   private:\
215213481Sgiacomo.travaglini@arm.com    GTEST_DISALLOW_ASSIGN_(name##MatcherP10);\
215313481Sgiacomo.travaglini@arm.com  };\
215413481Sgiacomo.travaglini@arm.com  template <typename p0##_type, typename p1##_type, typename p2##_type, \
215513481Sgiacomo.travaglini@arm.com      typename p3##_type, typename p4##_type, typename p5##_type, \
215613481Sgiacomo.travaglini@arm.com      typename p6##_type, typename p7##_type, typename p8##_type, \
215713481Sgiacomo.travaglini@arm.com      typename p9##_type>\
215813481Sgiacomo.travaglini@arm.com  inline name##MatcherP10<p0##_type, p1##_type, p2##_type, p3##_type, \
215913481Sgiacomo.travaglini@arm.com      p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, \
216013481Sgiacomo.travaglini@arm.com      p9##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \
216113481Sgiacomo.travaglini@arm.com      p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, p8##_type p8, \
216213481Sgiacomo.travaglini@arm.com      p9##_type p9) {\
216313481Sgiacomo.travaglini@arm.com    return name##MatcherP10<p0##_type, p1##_type, p2##_type, p3##_type, \
216413481Sgiacomo.travaglini@arm.com        p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, p9##_type>(p0, \
216513481Sgiacomo.travaglini@arm.com        p1, p2, p3, p4, p5, p6, p7, p8, p9);\
216613481Sgiacomo.travaglini@arm.com  }\
216713481Sgiacomo.travaglini@arm.com  template <typename p0##_type, typename p1##_type, typename p2##_type, \
216813481Sgiacomo.travaglini@arm.com      typename p3##_type, typename p4##_type, typename p5##_type, \
216913481Sgiacomo.travaglini@arm.com      typename p6##_type, typename p7##_type, typename p8##_type, \
217013481Sgiacomo.travaglini@arm.com      typename p9##_type>\
217113481Sgiacomo.travaglini@arm.com  template <typename arg_type>\
217213481Sgiacomo.travaglini@arm.com  bool name##MatcherP10<p0##_type, p1##_type, p2##_type, p3##_type, \
217313481Sgiacomo.travaglini@arm.com      p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, \
217413481Sgiacomo.travaglini@arm.com      p9##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
217513481Sgiacomo.travaglini@arm.com      arg_type arg, \
217613481Sgiacomo.travaglini@arm.com      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
217713481Sgiacomo.travaglini@arm.com          const
217813481Sgiacomo.travaglini@arm.com
217913481Sgiacomo.travaglini@arm.com#endif  // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_
2180