//
// Copyright 2016 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

$$ This is a pump file for generating the interface and implementation of
$$ optional's forwarding constructor and emplace() method.  Pump is a python
$$ script that is part of the Google Test suite of utilities.  Description
$$ can be found here:
$$
$$ http://code.google.com/p/googletest/wiki/PumpManual
$$

$var MAX_ARITY = 7

$range ARITY 0..MAX_ARITY

// clang-format off
// Begin forwarding constructor definitions ////////////////////////////////////

$for ARITY [[

$range ARG 1..ARITY

$if ARITY > 0 [[
  template <$for ARG , [[typename P$(ARG)]]>

]]
  explicit optional(in_place_t$if ARITY > 0 [[, ]]
                    $for ARG , [[const P$(ARG)& p$(ARG)]]) {
    InitializeAsDisengaged();
    new (void_value()) T($for ARG , [[p$(ARG)]]);
    engaged_ = true;
#if !defined(NDEBUG)
    value_ptr_ = static_cast<const T*>(void_value());
#endif
  }

]]
// End forwarding constructor definitions //////////////////////////////////////

// Begin emplace(...) definitions //////////////////////////////////////////////

$for ARITY [[

$range ARG 1..ARITY

$if ARITY > 0 [[
  template <$for ARG , [[typename P$(ARG)]]>

]]
  void emplace($for ARG , [[const P$(ARG)& p$(ARG)]]) {
    EnsureDisengaged();
    new (void_value()) T($for ARG , [[p$(ARG)]]);
    engaged_ = true;
#if !defined(NDEBUG)
    value_ptr_ = static_cast<const T*>(void_value());
#endif
  }

]]
// End emplace(...) definitions ////////////////////////////////////////////////
// clang-format on