Fixes a C++-standard-compliance bug in gmock-printers.h.
This commit is contained in:
		@@ -434,63 +434,10 @@ inline void PrintTo(const ::std::wstring& s, ::std::ostream* os) {
 | 
			
		||||
// Overload for ::std::tr1::tuple.  Needed for printing function
 | 
			
		||||
// arguments, which are packed as tuples.
 | 
			
		||||
 | 
			
		||||
typedef ::std::vector<string> Strings;
 | 
			
		||||
 | 
			
		||||
// This helper template allows PrintTo() for tuples and
 | 
			
		||||
// UniversalTersePrintTupleFieldsToStrings() to be defined by
 | 
			
		||||
// induction on the number of tuple fields.  The idea is that
 | 
			
		||||
// TuplePrefixPrinter<N>::PrintPrefixTo(t, os) prints the first N
 | 
			
		||||
// fields in tuple t, and can be defined in terms of
 | 
			
		||||
// TuplePrefixPrinter<N - 1>.
 | 
			
		||||
 | 
			
		||||
// The inductive case.
 | 
			
		||||
template <size_t N>
 | 
			
		||||
struct TuplePrefixPrinter {
 | 
			
		||||
  // Prints the first N fields of a tuple.
 | 
			
		||||
  template <typename Tuple>
 | 
			
		||||
  static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) {
 | 
			
		||||
    TuplePrefixPrinter<N - 1>::PrintPrefixTo(t, os);
 | 
			
		||||
    *os << ", ";
 | 
			
		||||
    UniversalPrinter<typename ::std::tr1::tuple_element<N - 1, Tuple>::type>
 | 
			
		||||
        ::Print(::std::tr1::get<N - 1>(t), os);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Tersely prints the first N fields of a tuple to a string vector,
 | 
			
		||||
  // one element for each field.
 | 
			
		||||
  template <typename Tuple>
 | 
			
		||||
  static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) {
 | 
			
		||||
    TuplePrefixPrinter<N - 1>::TersePrintPrefixToStrings(t, strings);
 | 
			
		||||
    ::std::stringstream ss;
 | 
			
		||||
    UniversalTersePrint(::std::tr1::get<N - 1>(t), &ss);
 | 
			
		||||
    strings->push_back(ss.str());
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Base cases.
 | 
			
		||||
template <>
 | 
			
		||||
struct TuplePrefixPrinter<0> {
 | 
			
		||||
  template <typename Tuple>
 | 
			
		||||
  static void PrintPrefixTo(const Tuple&, ::std::ostream*) {}
 | 
			
		||||
 | 
			
		||||
  template <typename Tuple>
 | 
			
		||||
  static void TersePrintPrefixToStrings(const Tuple&, Strings*) {}
 | 
			
		||||
};
 | 
			
		||||
template <>
 | 
			
		||||
template <typename Tuple>
 | 
			
		||||
void TuplePrefixPrinter<1>::PrintPrefixTo(const Tuple& t, ::std::ostream* os) {
 | 
			
		||||
  UniversalPrinter<typename ::std::tr1::tuple_element<0, Tuple>::type>::
 | 
			
		||||
      Print(::std::tr1::get<0>(t), os);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Helper function for printing a tuple.  T must be instantiated with
 | 
			
		||||
// a tuple type.
 | 
			
		||||
template <typename T>
 | 
			
		||||
void PrintTupleTo(const T& t, ::std::ostream* os) {
 | 
			
		||||
  *os << "(";
 | 
			
		||||
  TuplePrefixPrinter< ::std::tr1::tuple_size<T>::value>::
 | 
			
		||||
      PrintPrefixTo(t, os);
 | 
			
		||||
  *os << ")";
 | 
			
		||||
}
 | 
			
		||||
void PrintTupleTo(const T& t, ::std::ostream* os);
 | 
			
		||||
 | 
			
		||||
// Overloaded PrintTo() for tuples of various arities.  We support
 | 
			
		||||
// tuples of up-to 10 fields.  The following implementation works
 | 
			
		||||
@@ -725,6 +672,64 @@ void UniversalPrint(const T& value, ::std::ostream* os) {
 | 
			
		||||
  UniversalPrinter<T>::Print(value, os);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
typedef ::std::vector<string> Strings;
 | 
			
		||||
 | 
			
		||||
// This helper template allows PrintTo() for tuples and
 | 
			
		||||
// UniversalTersePrintTupleFieldsToStrings() to be defined by
 | 
			
		||||
// induction on the number of tuple fields.  The idea is that
 | 
			
		||||
// TuplePrefixPrinter<N>::PrintPrefixTo(t, os) prints the first N
 | 
			
		||||
// fields in tuple t, and can be defined in terms of
 | 
			
		||||
// TuplePrefixPrinter<N - 1>.
 | 
			
		||||
 | 
			
		||||
// The inductive case.
 | 
			
		||||
template <size_t N>
 | 
			
		||||
struct TuplePrefixPrinter {
 | 
			
		||||
  // Prints the first N fields of a tuple.
 | 
			
		||||
  template <typename Tuple>
 | 
			
		||||
  static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) {
 | 
			
		||||
    TuplePrefixPrinter<N - 1>::PrintPrefixTo(t, os);
 | 
			
		||||
    *os << ", ";
 | 
			
		||||
    UniversalPrinter<typename ::std::tr1::tuple_element<N - 1, Tuple>::type>
 | 
			
		||||
        ::Print(::std::tr1::get<N - 1>(t), os);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Tersely prints the first N fields of a tuple to a string vector,
 | 
			
		||||
  // one element for each field.
 | 
			
		||||
  template <typename Tuple>
 | 
			
		||||
  static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) {
 | 
			
		||||
    TuplePrefixPrinter<N - 1>::TersePrintPrefixToStrings(t, strings);
 | 
			
		||||
    ::std::stringstream ss;
 | 
			
		||||
    UniversalTersePrint(::std::tr1::get<N - 1>(t), &ss);
 | 
			
		||||
    strings->push_back(ss.str());
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Base cases.
 | 
			
		||||
template <>
 | 
			
		||||
struct TuplePrefixPrinter<0> {
 | 
			
		||||
  template <typename Tuple>
 | 
			
		||||
  static void PrintPrefixTo(const Tuple&, ::std::ostream*) {}
 | 
			
		||||
 | 
			
		||||
  template <typename Tuple>
 | 
			
		||||
  static void TersePrintPrefixToStrings(const Tuple&, Strings*) {}
 | 
			
		||||
};
 | 
			
		||||
template <>
 | 
			
		||||
template <typename Tuple>
 | 
			
		||||
void TuplePrefixPrinter<1>::PrintPrefixTo(const Tuple& t, ::std::ostream* os) {
 | 
			
		||||
  UniversalPrinter<typename ::std::tr1::tuple_element<0, Tuple>::type>::
 | 
			
		||||
      Print(::std::tr1::get<0>(t), os);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Helper function for printing a tuple.  T must be instantiated with
 | 
			
		||||
// a tuple type.
 | 
			
		||||
template <typename T>
 | 
			
		||||
void PrintTupleTo(const T& t, ::std::ostream* os) {
 | 
			
		||||
  *os << "(";
 | 
			
		||||
  TuplePrefixPrinter< ::std::tr1::tuple_size<T>::value>::
 | 
			
		||||
      PrintPrefixTo(t, os);
 | 
			
		||||
  *os << ")";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Prints the fields of a tuple tersely to a string vector, one
 | 
			
		||||
// element for each field.  See the comment before
 | 
			
		||||
// UniversalTersePrint() for how we define "tersely".
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user