Blame googletest/include/gtest/internal/gtest-param-util-generated.h.pump

Packit bd1cd8
$$ -*- mode: c++; -*-
Packit bd1cd8
$var n = 50  $$ Maximum length of Values arguments we want to support.
Packit bd1cd8
$var maxtuple = 10  $$ Maximum number of Combine arguments we want to support.
Packit bd1cd8
// Copyright 2008 Google Inc.
Packit bd1cd8
// All Rights Reserved.
Packit bd1cd8
//
Packit bd1cd8
// Redistribution and use in source and binary forms, with or without
Packit bd1cd8
// modification, are permitted provided that the following conditions are
Packit bd1cd8
// met:
Packit bd1cd8
//
Packit bd1cd8
//     * Redistributions of source code must retain the above copyright
Packit bd1cd8
// notice, this list of conditions and the following disclaimer.
Packit bd1cd8
//     * Redistributions in binary form must reproduce the above
Packit bd1cd8
// copyright notice, this list of conditions and the following disclaimer
Packit bd1cd8
// in the documentation and/or other materials provided with the
Packit bd1cd8
// distribution.
Packit bd1cd8
//     * Neither the name of Google Inc. nor the names of its
Packit bd1cd8
// contributors may be used to endorse or promote products derived from
Packit bd1cd8
// this software without specific prior written permission.
Packit bd1cd8
//
Packit bd1cd8
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
Packit bd1cd8
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
Packit bd1cd8
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
Packit bd1cd8
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
Packit bd1cd8
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
Packit bd1cd8
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
Packit bd1cd8
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
Packit bd1cd8
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
Packit bd1cd8
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Packit bd1cd8
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Packit bd1cd8
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Packit bd1cd8
//
Packit bd1cd8
// Author: vladl@google.com (Vlad Losev)
Packit bd1cd8
Packit bd1cd8
// Type and function utilities for implementing parameterized tests.
Packit bd1cd8
// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
Packit bd1cd8
//
Packit bd1cd8
// Currently Google Test supports at most $n arguments in Values,
Packit bd1cd8
// and at most $maxtuple arguments in Combine. Please contact
Packit bd1cd8
// googletestframework@googlegroups.com if you need more.
Packit bd1cd8
// Please note that the number of arguments to Combine is limited
Packit bd1cd8
// by the maximum arity of the implementation of tuple which is
Packit bd1cd8
// currently set at $maxtuple.
Packit bd1cd8
Packit bd1cd8
#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
Packit bd1cd8
#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
Packit bd1cd8
Packit bd1cd8
// scripts/fuse_gtest.py depends on gtest's own header being #included
Packit bd1cd8
// *unconditionally*.  Therefore these #includes cannot be moved
Packit bd1cd8
// inside #if GTEST_HAS_PARAM_TEST.
Packit bd1cd8
#include "gtest/internal/gtest-param-util.h"
Packit bd1cd8
#include "gtest/internal/gtest-port.h"
Packit bd1cd8
Packit bd1cd8
#if GTEST_HAS_PARAM_TEST
Packit bd1cd8
Packit bd1cd8
namespace testing {
Packit bd1cd8
Packit bd1cd8
// Forward declarations of ValuesIn(), which is implemented in
Packit bd1cd8
// include/gtest/gtest-param-test.h.
Packit bd1cd8
template <typename ForwardIterator>
Packit bd1cd8
internal::ParamGenerator<
Packit bd1cd8
  typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
Packit bd1cd8
ValuesIn(ForwardIterator begin, ForwardIterator end);
Packit bd1cd8
Packit bd1cd8
template <typename T, size_t N>
Packit bd1cd8
internal::ParamGenerator<T> ValuesIn(const T (&array)[N]);
Packit bd1cd8
Packit bd1cd8
template <class Container>
Packit bd1cd8
internal::ParamGenerator<typename Container::value_type> ValuesIn(
Packit bd1cd8
    const Container& container);
Packit bd1cd8
Packit bd1cd8
namespace internal {
Packit bd1cd8
Packit bd1cd8
// Used in the Values() function to provide polymorphic capabilities.
Packit bd1cd8
$range i 1..n
Packit bd1cd8
$for i [[
Packit bd1cd8
$range j 1..i
Packit bd1cd8
Packit bd1cd8
template <$for j, [[typename T$j]]>
Packit bd1cd8
class ValueArray$i {
Packit bd1cd8
 public:
Packit bd1cd8
  $if i==1 [[explicit ]]ValueArray$i($for j, [[T$j v$j]]) : $for j, [[v$(j)_(v$j)]] {}
Packit bd1cd8
Packit bd1cd8
  template <typename T>
Packit bd1cd8
  operator ParamGenerator<T>() const {
Packit bd1cd8
    const T array[] = {$for j, [[static_cast<T>(v$(j)_)]]};
Packit bd1cd8
    return ValuesIn(array);
Packit bd1cd8
  }
Packit bd1cd8
Packit bd1cd8
 private:
Packit bd1cd8
  // No implementation - assignment is unsupported.
Packit bd1cd8
  void operator=(const ValueArray$i& other);
Packit bd1cd8
Packit bd1cd8
$for j [[
Packit bd1cd8
Packit bd1cd8
  const T$j v$(j)_;
Packit bd1cd8
]]
Packit bd1cd8
Packit bd1cd8
};
Packit bd1cd8
Packit bd1cd8
]]
Packit bd1cd8
Packit bd1cd8
# if GTEST_HAS_COMBINE
Packit bd1cd8
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
Packit bd1cd8
//
Packit bd1cd8
// Generates values from the Cartesian product of values produced
Packit bd1cd8
// by the argument generators.
Packit bd1cd8
//
Packit bd1cd8
$range i 2..maxtuple
Packit bd1cd8
$for i [[
Packit bd1cd8
$range j 1..i
Packit bd1cd8
$range k 2..i
Packit bd1cd8
Packit bd1cd8
template <$for j, [[typename T$j]]>
Packit bd1cd8
class CartesianProductGenerator$i
Packit bd1cd8
    : public ParamGeneratorInterface< ::testing::tuple<$for j, [[T$j]]> > {
Packit bd1cd8
 public:
Packit bd1cd8
  typedef ::testing::tuple<$for j, [[T$j]]> ParamType;
Packit bd1cd8
Packit bd1cd8
  CartesianProductGenerator$i($for j, [[const ParamGenerator<T$j>& g$j]])
Packit bd1cd8
      : $for j, [[g$(j)_(g$j)]] {}
Packit bd1cd8
  virtual ~CartesianProductGenerator$i() {}
Packit bd1cd8
Packit bd1cd8
  virtual ParamIteratorInterface<ParamType>* Begin() const {
Packit bd1cd8
    return new Iterator(this, $for j, [[g$(j)_, g$(j)_.begin()]]);
Packit bd1cd8
  }
Packit bd1cd8
  virtual ParamIteratorInterface<ParamType>* End() const {
Packit bd1cd8
    return new Iterator(this, $for j, [[g$(j)_, g$(j)_.end()]]);
Packit bd1cd8
  }
Packit bd1cd8
Packit bd1cd8
 private:
Packit bd1cd8
  class Iterator : public ParamIteratorInterface<ParamType> {
Packit bd1cd8
   public:
Packit bd1cd8
    Iterator(const ParamGeneratorInterface<ParamType>* base, $for j, [[
Packit bd1cd8
Packit bd1cd8
      const ParamGenerator<T$j>& g$j,
Packit bd1cd8
      const typename ParamGenerator<T$j>::iterator& current$(j)]])
Packit bd1cd8
        : base_(base),
Packit bd1cd8
$for j, [[
Packit bd1cd8
Packit bd1cd8
          begin$(j)_(g$j.begin()), end$(j)_(g$j.end()), current$(j)_(current$j)
Packit bd1cd8
]]    {
Packit bd1cd8
      ComputeCurrentValue();
Packit bd1cd8
    }
Packit bd1cd8
    virtual ~Iterator() {}
Packit bd1cd8
Packit bd1cd8
    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
Packit bd1cd8
      return base_;
Packit bd1cd8
    }
Packit bd1cd8
    // Advance should not be called on beyond-of-range iterators
Packit bd1cd8
    // so no component iterators must be beyond end of range, either.
Packit bd1cd8
    virtual void Advance() {
Packit bd1cd8
      assert(!AtEnd());
Packit bd1cd8
      ++current$(i)_;
Packit bd1cd8
Packit bd1cd8
$for k [[
Packit bd1cd8
      if (current$(i+2-k)_ == end$(i+2-k)_) {
Packit bd1cd8
        current$(i+2-k)_ = begin$(i+2-k)_;
Packit bd1cd8
        ++current$(i+2-k-1)_;
Packit bd1cd8
      }
Packit bd1cd8
Packit bd1cd8
]]
Packit bd1cd8
      ComputeCurrentValue();
Packit bd1cd8
    }
Packit bd1cd8
    virtual ParamIteratorInterface<ParamType>* Clone() const {
Packit bd1cd8
      return new Iterator(*this);
Packit bd1cd8
    }
Packit bd1cd8
    virtual const ParamType* Current() const { return &current_value_; }
Packit bd1cd8
    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
Packit bd1cd8
      // Having the same base generator guarantees that the other
Packit bd1cd8
      // iterator is of the same type and we can downcast.
Packit bd1cd8
      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
Packit bd1cd8
          << "The program attempted to compare iterators "
Packit bd1cd8
          << "from different generators." << std::endl;
Packit bd1cd8
      const Iterator* typed_other =
Packit bd1cd8
          CheckedDowncastToActualType<const Iterator>(&other);
Packit bd1cd8
      // We must report iterators equal if they both point beyond their
Packit bd1cd8
      // respective ranges. That can happen in a variety of fashions,
Packit bd1cd8
      // so we have to consult AtEnd().
Packit bd1cd8
      return (AtEnd() && typed_other->AtEnd()) ||
Packit bd1cd8
         ($for j  && [[
Packit bd1cd8
Packit bd1cd8
          current$(j)_ == typed_other->current$(j)_
Packit bd1cd8
]]);
Packit bd1cd8
    }
Packit bd1cd8
Packit bd1cd8
   private:
Packit bd1cd8
    Iterator(const Iterator& other)
Packit bd1cd8
        : base_(other.base_), $for j, [[
Packit bd1cd8
Packit bd1cd8
        begin$(j)_(other.begin$(j)_),
Packit bd1cd8
        end$(j)_(other.end$(j)_),
Packit bd1cd8
        current$(j)_(other.current$(j)_)
Packit bd1cd8
]] {
Packit bd1cd8
      ComputeCurrentValue();
Packit bd1cd8
    }
Packit bd1cd8
Packit bd1cd8
    void ComputeCurrentValue() {
Packit bd1cd8
      if (!AtEnd())
Packit bd1cd8
        current_value_ = ParamType($for j, [[*current$(j)_]]);
Packit bd1cd8
    }
Packit bd1cd8
    bool AtEnd() const {
Packit bd1cd8
      // We must report iterator past the end of the range when either of the
Packit bd1cd8
      // component iterators has reached the end of its range.
Packit bd1cd8
      return
Packit bd1cd8
$for j  || [[
Packit bd1cd8
Packit bd1cd8
          current$(j)_ == end$(j)_
Packit bd1cd8
]];
Packit bd1cd8
    }
Packit bd1cd8
Packit bd1cd8
    // No implementation - assignment is unsupported.
Packit bd1cd8
    void operator=(const Iterator& other);
Packit bd1cd8
Packit bd1cd8
    const ParamGeneratorInterface<ParamType>* const base_;
Packit bd1cd8
    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
Packit bd1cd8
    // current[i]_ is the actual traversing iterator.
Packit bd1cd8
$for j [[
Packit bd1cd8
Packit bd1cd8
    const typename ParamGenerator<T$j>::iterator begin$(j)_;
Packit bd1cd8
    const typename ParamGenerator<T$j>::iterator end$(j)_;
Packit bd1cd8
    typename ParamGenerator<T$j>::iterator current$(j)_;
Packit bd1cd8
]]
Packit bd1cd8
Packit bd1cd8
    ParamType current_value_;
Packit bd1cd8
  };  // class CartesianProductGenerator$i::Iterator
Packit bd1cd8
Packit bd1cd8
  // No implementation - assignment is unsupported.
Packit bd1cd8
  void operator=(const CartesianProductGenerator$i& other);
Packit bd1cd8
Packit bd1cd8
Packit bd1cd8
$for j [[
Packit bd1cd8
  const ParamGenerator<T$j> g$(j)_;
Packit bd1cd8
Packit bd1cd8
]]
Packit bd1cd8
};  // class CartesianProductGenerator$i
Packit bd1cd8
Packit bd1cd8
Packit bd1cd8
]]
Packit bd1cd8
Packit bd1cd8
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
Packit bd1cd8
//
Packit bd1cd8
// Helper classes providing Combine() with polymorphic features. They allow
Packit bd1cd8
// casting CartesianProductGeneratorN<T> to ParamGenerator<U> if T is
Packit bd1cd8
// convertible to U.
Packit bd1cd8
//
Packit bd1cd8
$range i 2..maxtuple
Packit bd1cd8
$for i [[
Packit bd1cd8
$range j 1..i
Packit bd1cd8
Packit bd1cd8
template <$for j, [[class Generator$j]]>
Packit bd1cd8
class CartesianProductHolder$i {
Packit bd1cd8
 public:
Packit bd1cd8
CartesianProductHolder$i($for j, [[const Generator$j& g$j]])
Packit bd1cd8
      : $for j, [[g$(j)_(g$j)]] {}
Packit bd1cd8
  template <$for j, [[typename T$j]]>
Packit bd1cd8
  operator ParamGenerator< ::testing::tuple<$for j, [[T$j]]> >() const {
Packit bd1cd8
    return ParamGenerator< ::testing::tuple<$for j, [[T$j]]> >(
Packit bd1cd8
        new CartesianProductGenerator$i<$for j, [[T$j]]>(
Packit bd1cd8
$for j,[[
Packit bd1cd8
Packit bd1cd8
        static_cast<ParamGenerator<T$j> >(g$(j)_)
Packit bd1cd8
]]));
Packit bd1cd8
  }
Packit bd1cd8
Packit bd1cd8
 private:
Packit bd1cd8
  // No implementation - assignment is unsupported.
Packit bd1cd8
  void operator=(const CartesianProductHolder$i& other);
Packit bd1cd8
Packit bd1cd8
Packit bd1cd8
$for j [[
Packit bd1cd8
  const Generator$j g$(j)_;
Packit bd1cd8
Packit bd1cd8
]]
Packit bd1cd8
};  // class CartesianProductHolder$i
Packit bd1cd8
Packit bd1cd8
]]
Packit bd1cd8
Packit bd1cd8
# endif  // GTEST_HAS_COMBINE
Packit bd1cd8
Packit bd1cd8
}  // namespace internal
Packit bd1cd8
}  // namespace testing
Packit bd1cd8
Packit bd1cd8
#endif  //  GTEST_HAS_PARAM_TEST
Packit bd1cd8
Packit bd1cd8
#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_