// Copyright (c) FIRST and other WPILib contributors. // Open Source Software; you can modify and/or share it under the terms of // the WPILib BSD license file in the root directory of this project. #pragma once #ifdef _WIN32 #pragma warning(push) #pragma warning(disable : 4521) #endif #include #include #include #include #include #include #include #include #include "frc2/command/CommandGroupBase.h" #include "frc2/command/CommandHelper.h" namespace frc2 { const size_t invalid_index = std::numeric_limits::max(); /** * A CommandGroups that runs a list of commands in sequence. * *

As a rule, CommandGroups require the union of the requirements of their * component commands. */ class SequentialCommandGroup : public CommandHelper { public: /** * Creates a new SequentialCommandGroup. The given commands will be run * sequentially, with the CommandGroup finishing when the last command * finishes. * * @param commands the commands to include in this group. */ explicit SequentialCommandGroup( std::vector>&& commands); /** * Creates a new SequentialCommandGroup. The given commands will be run * sequentially, with the CommandGroup finishing when the last command * finishes. * * @param commands the commands to include in this group. */ template >...>>> explicit SequentialCommandGroup(Types&&... commands) { AddCommands(std::forward(commands)...); } SequentialCommandGroup(SequentialCommandGroup&& other) = default; // No copy constructors for command groups SequentialCommandGroup(const SequentialCommandGroup&) = delete; // Prevent template expansion from emulating copy ctor SequentialCommandGroup(SequentialCommandGroup&) = delete; template >...>>> void AddCommands(Types&&... commands) { std::vector> foo; ((void)foo.emplace_back(std::make_unique>( std::forward(commands))), ...); AddCommands(std::move(foo)); } void Initialize() override; void Execute() override; void End(bool interrupted) override; bool IsFinished() override; bool RunsWhenDisabled() const override; private: void AddCommands(std::vector>&& commands) final; wpi::SmallVector, 4> m_commands; size_t m_currentCommandIndex{invalid_index}; bool m_runWhenDisabled{true}; }; } // namespace frc2 #ifdef _WIN32 #pragma warning(pop) #endif