From 80f1d792187be73e6747d356982201d1ea58ce2f Mon Sep 17 00:00:00 2001 From: Peter Johnson Date: Sun, 23 May 2021 20:46:25 -0700 Subject: [PATCH] [wpiutil] Split function_ref to a separate header --- .../lib/native/cpp/hardware/LEDDisplay.cpp | 2 + .../include/glass/hardware/AnalogGyro.h | 2 +- .../include/glass/hardware/AnalogInput.h | 2 +- .../include/glass/hardware/AnalogOutput.h | 2 +- .../lib/native/include/glass/hardware/DIO.h | 2 +- .../native/include/glass/hardware/Encoder.h | 2 +- .../include/glass/hardware/LEDDisplay.h | 2 +- .../lib/native/include/glass/hardware/PCM.h | 2 +- .../lib/native/include/glass/hardware/PDP.h | 2 +- .../lib/native/include/glass/hardware/PWM.h | 2 +- .../lib/native/include/glass/hardware/Relay.h | 2 +- .../lib/native/include/glass/other/Field2D.h | 2 +- .../native/include/glass/other/Mechanism2D.h | 2 +- .../glass/networktables/NTDifferentialDrive.h | 1 - .../glass/networktables/NTMecanumDrive.h | 1 - .../glass/networktables/NetworkTables.h | 1 - .../frc/smartdashboard/SendableRegistry.h | 2 +- .../src/main/native/include/wpi/STLExtras.h | 39 +---------- .../main/native/include/wpi/function_ref.h | 65 +++++++++++++++++++ 19 files changed, 81 insertions(+), 54 deletions(-) create mode 100644 wpiutil/src/main/native/include/wpi/function_ref.h diff --git a/glass/src/lib/native/cpp/hardware/LEDDisplay.cpp b/glass/src/lib/native/cpp/hardware/LEDDisplay.cpp index c32e3df1a3..c1ece3a142 100644 --- a/glass/src/lib/native/cpp/hardware/LEDDisplay.cpp +++ b/glass/src/lib/native/cpp/hardware/LEDDisplay.cpp @@ -4,6 +4,8 @@ #include "glass/hardware/LEDDisplay.h" +#include + #include "glass/Context.h" #include "glass/support/ExtraGuiWidgets.h" diff --git a/glass/src/lib/native/include/glass/hardware/AnalogGyro.h b/glass/src/lib/native/include/glass/hardware/AnalogGyro.h index b0ae397706..fdfcf4f798 100644 --- a/glass/src/lib/native/include/glass/hardware/AnalogGyro.h +++ b/glass/src/lib/native/include/glass/hardware/AnalogGyro.h @@ -4,7 +4,7 @@ #pragma once -#include +#include #include "glass/Model.h" diff --git a/glass/src/lib/native/include/glass/hardware/AnalogInput.h b/glass/src/lib/native/include/glass/hardware/AnalogInput.h index 10f4b40b79..2e49b9ccce 100644 --- a/glass/src/lib/native/include/glass/hardware/AnalogInput.h +++ b/glass/src/lib/native/include/glass/hardware/AnalogInput.h @@ -6,7 +6,7 @@ #include -#include +#include #include "glass/Model.h" diff --git a/glass/src/lib/native/include/glass/hardware/AnalogOutput.h b/glass/src/lib/native/include/glass/hardware/AnalogOutput.h index 16f95a3e05..7ba8be6dd1 100644 --- a/glass/src/lib/native/include/glass/hardware/AnalogOutput.h +++ b/glass/src/lib/native/include/glass/hardware/AnalogOutput.h @@ -4,7 +4,7 @@ #pragma once -#include +#include #include "glass/Model.h" diff --git a/glass/src/lib/native/include/glass/hardware/DIO.h b/glass/src/lib/native/include/glass/hardware/DIO.h index a8236f3487..5593ba69da 100644 --- a/glass/src/lib/native/include/glass/hardware/DIO.h +++ b/glass/src/lib/native/include/glass/hardware/DIO.h @@ -6,7 +6,7 @@ #include -#include +#include #include "glass/Model.h" diff --git a/glass/src/lib/native/include/glass/hardware/Encoder.h b/glass/src/lib/native/include/glass/hardware/Encoder.h index d553ef10fa..41d781aa9a 100644 --- a/glass/src/lib/native/include/glass/hardware/Encoder.h +++ b/glass/src/lib/native/include/glass/hardware/Encoder.h @@ -6,7 +6,7 @@ #include -#include +#include #include "glass/Model.h" diff --git a/glass/src/lib/native/include/glass/hardware/LEDDisplay.h b/glass/src/lib/native/include/glass/hardware/LEDDisplay.h index c7af045897..ddd3c27ca0 100644 --- a/glass/src/lib/native/include/glass/hardware/LEDDisplay.h +++ b/glass/src/lib/native/include/glass/hardware/LEDDisplay.h @@ -4,7 +4,7 @@ #pragma once -#include +#include #include #include "glass/Model.h" diff --git a/glass/src/lib/native/include/glass/hardware/PCM.h b/glass/src/lib/native/include/glass/hardware/PCM.h index af8bde892e..107a2a84fc 100644 --- a/glass/src/lib/native/include/glass/hardware/PCM.h +++ b/glass/src/lib/native/include/glass/hardware/PCM.h @@ -6,7 +6,7 @@ #include -#include +#include #include "glass/Model.h" diff --git a/glass/src/lib/native/include/glass/hardware/PDP.h b/glass/src/lib/native/include/glass/hardware/PDP.h index c0d5c3f487..8417ea35d6 100644 --- a/glass/src/lib/native/include/glass/hardware/PDP.h +++ b/glass/src/lib/native/include/glass/hardware/PDP.h @@ -6,7 +6,7 @@ #include -#include +#include #include "glass/Model.h" diff --git a/glass/src/lib/native/include/glass/hardware/PWM.h b/glass/src/lib/native/include/glass/hardware/PWM.h index d8a6a4ed47..74c7461c8a 100644 --- a/glass/src/lib/native/include/glass/hardware/PWM.h +++ b/glass/src/lib/native/include/glass/hardware/PWM.h @@ -6,7 +6,7 @@ #include -#include +#include #include "glass/Model.h" diff --git a/glass/src/lib/native/include/glass/hardware/Relay.h b/glass/src/lib/native/include/glass/hardware/Relay.h index 287c42b71b..b025119b6b 100644 --- a/glass/src/lib/native/include/glass/hardware/Relay.h +++ b/glass/src/lib/native/include/glass/hardware/Relay.h @@ -6,7 +6,7 @@ #include -#include +#include #include "glass/Model.h" diff --git a/glass/src/lib/native/include/glass/other/Field2D.h b/glass/src/lib/native/include/glass/other/Field2D.h index 8c86acd702..9399876ac5 100644 --- a/glass/src/lib/native/include/glass/other/Field2D.h +++ b/glass/src/lib/native/include/glass/other/Field2D.h @@ -10,7 +10,7 @@ #include #include #include -#include +#include #include #include "glass/Model.h" diff --git a/glass/src/lib/native/include/glass/other/Mechanism2D.h b/glass/src/lib/native/include/glass/other/Mechanism2D.h index 58af961143..7617e6f3ca 100644 --- a/glass/src/lib/native/include/glass/other/Mechanism2D.h +++ b/glass/src/lib/native/include/glass/other/Mechanism2D.h @@ -7,7 +7,7 @@ #include #include #include -#include +#include #include "glass/Model.h" #include "glass/View.h" diff --git a/glass/src/libnt/native/include/glass/networktables/NTDifferentialDrive.h b/glass/src/libnt/native/include/glass/networktables/NTDifferentialDrive.h index 3dcf72106d..49b3eb0518 100644 --- a/glass/src/libnt/native/include/glass/networktables/NTDifferentialDrive.h +++ b/glass/src/libnt/native/include/glass/networktables/NTDifferentialDrive.h @@ -9,7 +9,6 @@ #include #include -#include #include "glass/DataSource.h" #include "glass/networktables/NetworkTablesHelper.h" diff --git a/glass/src/libnt/native/include/glass/networktables/NTMecanumDrive.h b/glass/src/libnt/native/include/glass/networktables/NTMecanumDrive.h index 3d4718a207..ce7d2342df 100644 --- a/glass/src/libnt/native/include/glass/networktables/NTMecanumDrive.h +++ b/glass/src/libnt/native/include/glass/networktables/NTMecanumDrive.h @@ -9,7 +9,6 @@ #include #include -#include #include "glass/DataSource.h" #include "glass/networktables/NetworkTablesHelper.h" diff --git a/glass/src/libnt/native/include/glass/networktables/NetworkTables.h b/glass/src/libnt/native/include/glass/networktables/NetworkTables.h index e16ac3ad14..8538eaa4d6 100644 --- a/glass/src/libnt/native/include/glass/networktables/NetworkTables.h +++ b/glass/src/libnt/native/include/glass/networktables/NetworkTables.h @@ -11,7 +11,6 @@ #include #include -#include #include "glass/Model.h" #include "glass/View.h" diff --git a/wpilibc/src/main/native/include/frc/smartdashboard/SendableRegistry.h b/wpilibc/src/main/native/include/frc/smartdashboard/SendableRegistry.h index e93d77a613..2109ec245f 100644 --- a/wpilibc/src/main/native/include/frc/smartdashboard/SendableRegistry.h +++ b/wpilibc/src/main/native/include/frc/smartdashboard/SendableRegistry.h @@ -9,7 +9,7 @@ #include #include -#include +#include namespace frc { diff --git a/wpiutil/src/main/native/include/wpi/STLExtras.h b/wpiutil/src/main/native/include/wpi/STLExtras.h index d7ddd9286d..7f4d6d9250 100644 --- a/wpiutil/src/main/native/include/wpi/STLExtras.h +++ b/wpiutil/src/main/native/include/wpi/STLExtras.h @@ -18,6 +18,7 @@ #define WPIUTIL_WPI_STLEXTRAS_H #include "wpi/SmallVector.h" +#include "wpi/function_ref.h" #include "wpi/iterator.h" #include "wpi/iterator_range.h" #include "wpi/ErrorHandling.h" @@ -94,44 +95,6 @@ template struct greater_ptr { } }; -/// An efficient, type-erasing, non-owning reference to a callable. This is -/// intended for use as the type of a function parameter that is not used -/// after the function in question returns. -/// -/// This class does not own the callable, so it is not in general safe to store -/// a function_ref. -template class function_ref; - -template -class function_ref { - Ret (*callback)(intptr_t callable, Params ...params) = nullptr; - intptr_t callable; - - template - static Ret callback_fn(intptr_t callable, Params ...params) { - return (*reinterpret_cast(callable))( - std::forward(params)...); - } - -public: - function_ref() = default; - function_ref(std::nullptr_t) {} - - template - function_ref(Callable &&callable, - typename std::enable_if< - !std::is_same::type, - function_ref>::value>::type * = nullptr) - : callback(callback_fn::type>), - callable(reinterpret_cast(&callable)) {} - - Ret operator()(Params ...params) const { - return callback(callable, std::forward(params)...); - } - - explicit operator bool() const { return callback; } -}; - // deleter - Very very very simple method that is used to invoke operator // delete on something. It is used like this: // diff --git a/wpiutil/src/main/native/include/wpi/function_ref.h b/wpiutil/src/main/native/include/wpi/function_ref.h new file mode 100644 index 0000000000..05654153d1 --- /dev/null +++ b/wpiutil/src/main/native/include/wpi/function_ref.h @@ -0,0 +1,65 @@ +// 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. + +//===- llvm/ADT/STLExtras.h - Useful STL related functions ------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef WPIUTIL_WPI_FUNCTION_REF_H_ +#define WPIUTIL_WPI_FUNCTION_REF_H_ + +#include + +#include +#include + +namespace wpi { + +/// An efficient, type-erasing, non-owning reference to a callable. This is +/// intended for use as the type of a function parameter that is not used +/// after the function in question returns. +/// +/// This class does not own the callable, so it is not in general safe to store +/// a function_ref. +template +class function_ref; + +template +class function_ref { + Ret (*callback)(intptr_t callable, Params... params) = nullptr; + intptr_t callable; + + template + static Ret callback_fn(intptr_t callable, Params... params) { + return (*reinterpret_cast(callable))( + std::forward(params)...); + } + + public: + function_ref() = default; + function_ref(std::nullptr_t) {} + + template + function_ref(Callable&& callable, + typename std::enable_if< + !std::is_same::type, + function_ref>::value>::type* = nullptr) + : callback(callback_fn::type>), + callable(reinterpret_cast(&callable)) {} + + Ret operator()(Params... params) const { + return callback(callable, std::forward(params)...); + } + + explicit operator bool() const { return callback; } +}; + +} // namespace wpi + +#endif // WPIUTIL_WPI_FUNCTION_REF_H_