diff --git a/cscore/src/main/native/cpp/CvSourceImpl.cpp b/cscore/src/main/native/cpp/CvSourceImpl.cpp index 8d5a38d8d1..7cd4fe03d7 100644 --- a/cscore/src/main/native/cpp/CvSourceImpl.cpp +++ b/cscore/src/main/native/cpp/CvSourceImpl.cpp @@ -7,7 +7,6 @@ #include #include #include -#include #include #include "Handle.h" diff --git a/cscore/src/main/native/linux/UsbCameraImpl.cpp b/cscore/src/main/native/linux/UsbCameraImpl.cpp index 3e84578d18..a08fbbc7a5 100644 --- a/cscore/src/main/native/linux/UsbCameraImpl.cpp +++ b/cscore/src/main/native/linux/UsbCameraImpl.cpp @@ -41,6 +41,14 @@ using namespace cs; +namespace { +// Find the length of an array. +template +constexpr inline size_t array_lengthof(T (&)[N]) { + return N; +} +} // namespace + static constexpr char const* kPropWbAuto = "white_balance_temperature_auto"; static constexpr char const* kPropWbValue = "white_balance_temperature"; static constexpr char const* kPropExAuto = "exposure_auto"; @@ -124,7 +132,7 @@ int UsbCameraImpl::RawToPercentage(const UsbCameraProperty& rawProp, // LifeCam exposure setting quirk if (m_lifecam_exposure && rawProp.name == "raw_exposure_absolute" && rawProp.minimum == 5 && rawProp.maximum == 20000) { - int nelems = wpi::array_lengthof(quirkLifeCamHd3000); + int nelems = array_lengthof(quirkLifeCamHd3000); for (int i = 0; i < nelems; ++i) { if (rawValue < quirkLifeCamHd3000[i]) { return 100.0 * i / nelems; @@ -141,7 +149,7 @@ int UsbCameraImpl::PercentageToRaw(const UsbCameraProperty& rawProp, // LifeCam exposure setting quirk if (m_lifecam_exposure && rawProp.name == "raw_exposure_absolute" && rawProp.minimum == 5 && rawProp.maximum == 20000) { - int nelems = wpi::array_lengthof(quirkLifeCamHd3000); + int nelems = array_lengthof(quirkLifeCamHd3000); int ndx = nelems * percentValue / 100.0; if (ndx < 0) { ndx = 0; diff --git a/cscore/src/main/native/linux/UsbCameraImpl.h b/cscore/src/main/native/linux/UsbCameraImpl.h index c0273431ee..a03246653c 100644 --- a/cscore/src/main/native/linux/UsbCameraImpl.h +++ b/cscore/src/main/native/linux/UsbCameraImpl.h @@ -15,7 +15,6 @@ #include #include -#include #include #include #include diff --git a/cscore/src/main/native/windows/UsbCameraImpl.h b/cscore/src/main/native/windows/UsbCameraImpl.h index 05ee359bfc..d770b7b5b8 100644 --- a/cscore/src/main/native/windows/UsbCameraImpl.h +++ b/cscore/src/main/native/windows/UsbCameraImpl.h @@ -22,7 +22,6 @@ #include #include -#include #include #include #include diff --git a/wpiutil/src/main/native/cpp/HttpUtil.cpp b/wpiutil/src/main/native/cpp/HttpUtil.cpp index 07aa3523ff..afce3a6e34 100644 --- a/wpiutil/src/main/native/cpp/HttpUtil.cpp +++ b/wpiutil/src/main/native/cpp/HttpUtil.cpp @@ -8,7 +8,6 @@ #include "fmt/format.h" #include "wpi/Base64.h" -#include "wpi/STLExtras.h" #include "wpi/StringExtras.h" #include "wpi/TCPConnector.h" #include "wpi/raw_ostream.h" diff --git a/wpiutil/src/main/native/cpp/llvm/raw_ostream.cpp b/wpiutil/src/main/native/cpp/llvm/raw_ostream.cpp index b33df58266..622e0bf954 100644 --- a/wpiutil/src/main/native/cpp/llvm/raw_ostream.cpp +++ b/wpiutil/src/main/native/cpp/llvm/raw_ostream.cpp @@ -16,7 +16,6 @@ #endif #include "wpi/raw_ostream.h" -#include "wpi/STLExtras.h" #include "wpi/SmallString.h" #include "wpi/SmallVector.h" #include "wpi/StringExtras.h" @@ -65,6 +64,14 @@ using namespace wpi; +namespace { +// Find the length of an array. +template +constexpr inline size_t array_lengthof(T (&)[N]) { + return N; +} +} // namespace + raw_ostream::~raw_ostream() { // raw_ostream's subclasses should take care to flush the buffer // in their destructors. diff --git a/wpiutil/src/main/native/include/wpi/STLExtras.h b/wpiutil/src/main/native/include/wpi/STLExtras.h deleted file mode 100644 index 7f4d6d9250..0000000000 --- a/wpiutil/src/main/native/include/wpi/STLExtras.h +++ /dev/null @@ -1,1311 +0,0 @@ -//===- 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. -// -//===----------------------------------------------------------------------===// -// -// This file contains some templates that are useful if you are working with the -// STL at all. -// -// No library is required when using these functions. -// -//===----------------------------------------------------------------------===// - -#ifndef WPIUTIL_WPI_STLEXTRAS_H -#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" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace wpi { - -// Only used by compiler if both template types are the same. Useful when -// using SFINAE to test for the existence of member functions. -template struct SameType; - -namespace detail { - -template -using IterOfRange = decltype(std::begin(std::declval())); - -template -using ValueOfRange = typename std::remove_reference()))>::type; - -} // end namespace detail - -//===----------------------------------------------------------------------===// -// Extra additions to -//===----------------------------------------------------------------------===// - -template struct make_const_ptr { - using type = - typename std::add_pointer::type>::type; -}; - -template struct make_const_ref { - using type = typename std::add_lvalue_reference< - typename std::add_const::type>::type; -}; - -//===----------------------------------------------------------------------===// -// Extra additions to -//===----------------------------------------------------------------------===// - -template struct identity { - using argument_type = Ty; - - Ty &operator()(Ty &self) const { - return self; - } - const Ty &operator()(const Ty &self) const { - return self; - } -}; - -template struct less_ptr { - bool operator()(const Ty* left, const Ty* right) const { - return *left < *right; - } -}; - -template struct greater_ptr { - bool operator()(const Ty* left, const Ty* right) const { - return *right < *left; - } -}; - -// deleter - Very very very simple method that is used to invoke operator -// delete on something. It is used like this: -// -// for_each(V.begin(), B.end(), deleter); -template -inline void deleter(T *Ptr) { - delete Ptr; -} - -//===----------------------------------------------------------------------===// -// Extra additions to -//===----------------------------------------------------------------------===// - -namespace adl_detail { - -using std::begin; - -template -auto adl_begin(ContainerTy &&container) - -> decltype(begin(std::forward(container))) { - return begin(std::forward(container)); -} - -using std::end; - -template -auto adl_end(ContainerTy &&container) - -> decltype(end(std::forward(container))) { - return end(std::forward(container)); -} - -using std::swap; - -template -void adl_swap(T &&lhs, T &&rhs) noexcept(noexcept(swap(std::declval(), - std::declval()))) { - swap(std::forward(lhs), std::forward(rhs)); -} - -} // end namespace adl_detail - -template -auto adl_begin(ContainerTy &&container) - -> decltype(adl_detail::adl_begin(std::forward(container))) { - return adl_detail::adl_begin(std::forward(container)); -} - -template -auto adl_end(ContainerTy &&container) - -> decltype(adl_detail::adl_end(std::forward(container))) { - return adl_detail::adl_end(std::forward(container)); -} - -template -void adl_swap(T &&lhs, T &&rhs) noexcept( - noexcept(adl_detail::adl_swap(std::declval(), std::declval()))) { - adl_detail::adl_swap(std::forward(lhs), std::forward(rhs)); -} - -/// Test whether \p RangeOrContainer is empty. Similar to C++17 std::empty. -template -constexpr bool empty(const T &RangeOrContainer) { - return adl_begin(RangeOrContainer) == adl_end(RangeOrContainer); -} - -// mapped_iterator - This is a simple iterator adapter that causes a function to -// be applied whenever operator* is invoked on the iterator. - -template ()(*std::declval()))> -class mapped_iterator - : public iterator_adaptor_base< - mapped_iterator, ItTy, - typename std::iterator_traits::iterator_category, - typename std::remove_reference::type> { -public: - mapped_iterator(ItTy U, FuncTy F) - : mapped_iterator::iterator_adaptor_base(std::move(U)), F(std::move(F)) {} - - ItTy getCurrent() { return this->I; } - - FuncReturnTy operator*() { return F(*this->I); } - -private: - FuncTy F; -}; - -// map_iterator - Provide a convenient way to create mapped_iterators, just like -// make_pair is useful for creating pairs... -template -inline mapped_iterator map_iterator(ItTy I, FuncTy F) { - return mapped_iterator(std::move(I), std::move(F)); -} - -/// Helper to determine if type T has a member called rbegin(). -template class has_rbegin_impl { - using yes = char[1]; - using no = char[2]; - - template - static yes& test(Inner *I, decltype(I->rbegin()) * = nullptr); - - template - static no& test(...); - -public: - static const bool value = sizeof(test(nullptr)) == sizeof(yes); -}; - -/// Metafunction to determine if T& or T has a member called rbegin(). -template -struct has_rbegin : has_rbegin_impl::type> { -}; - -// Returns an iterator_range over the given container which iterates in reverse. -// Note that the container must have rbegin()/rend() methods for this to work. -template -auto reverse(ContainerTy &&C, - typename std::enable_if::value>::type * = - nullptr) -> decltype(make_range(C.rbegin(), C.rend())) { - return make_range(C.rbegin(), C.rend()); -} - -// Returns a std::reverse_iterator wrapped around the given iterator. -template -std::reverse_iterator make_reverse_iterator(IteratorTy It) { - return std::reverse_iterator(It); -} - -// Returns an iterator_range over the given container which iterates in reverse. -// Note that the container must have begin()/end() methods which return -// bidirectional iterators for this to work. -template -auto reverse( - ContainerTy &&C, - typename std::enable_if::value>::type * = nullptr) - -> decltype(make_range(wpi::make_reverse_iterator(std::end(C)), - wpi::make_reverse_iterator(std::begin(C)))) { - return make_range(wpi::make_reverse_iterator(std::end(C)), - wpi::make_reverse_iterator(std::begin(C))); -} - -/// An iterator adaptor that filters the elements of given inner iterators. -/// -/// The predicate parameter should be a callable object that accepts the wrapped -/// iterator's reference type and returns a bool. When incrementing or -/// decrementing the iterator, it will call the predicate on each element and -/// skip any where it returns false. -/// -/// \code -/// int A[] = { 1, 2, 3, 4 }; -/// auto R = make_filter_range(A, [](int N) { return N % 2 == 1; }); -/// // R contains { 1, 3 }. -/// \endcode -/// -/// Note: filter_iterator_base implements support for forward iteration. -/// filter_iterator_impl exists to provide support for bidirectional iteration, -/// conditional on whether the wrapped iterator supports it. -template -class filter_iterator_base - : public iterator_adaptor_base< - filter_iterator_base, - WrappedIteratorT, - typename std::common_type< - IterTag, typename std::iterator_traits< - WrappedIteratorT>::iterator_category>::type> { - using BaseT = iterator_adaptor_base< - filter_iterator_base, - WrappedIteratorT, - typename std::common_type< - IterTag, typename std::iterator_traits< - WrappedIteratorT>::iterator_category>::type>; - -protected: - WrappedIteratorT End; - PredicateT Pred; - - void findNextValid() { - while (this->I != End && !Pred(*this->I)) - BaseT::operator++(); - } - - // Construct the iterator. The begin iterator needs to know where the end - // is, so that it can properly stop when it gets there. The end iterator only - // needs the predicate to support bidirectional iteration. - filter_iterator_base(WrappedIteratorT Begin, WrappedIteratorT End, - PredicateT Pred) - : BaseT(Begin), End(End), Pred(Pred) { - findNextValid(); - } - -public: - using BaseT::operator++; - - filter_iterator_base &operator++() { - BaseT::operator++(); - findNextValid(); - return *this; - } -}; - -/// Specialization of filter_iterator_base for forward iteration only. -template -class filter_iterator_impl - : public filter_iterator_base { - using BaseT = filter_iterator_base; - -public: - filter_iterator_impl(WrappedIteratorT Begin, WrappedIteratorT End, - PredicateT Pred) - : BaseT(Begin, End, Pred) {} -}; - -/// Specialization of filter_iterator_base for bidirectional iteration. -template -class filter_iterator_impl - : public filter_iterator_base { - using BaseT = filter_iterator_base; - void findPrevValid() { - while (!this->Pred(*this->I)) - BaseT::operator--(); - } - -public: - using BaseT::operator--; - - filter_iterator_impl(WrappedIteratorT Begin, WrappedIteratorT End, - PredicateT Pred) - : BaseT(Begin, End, Pred) {} - - filter_iterator_impl &operator--() { - BaseT::operator--(); - findPrevValid(); - return *this; - } -}; - -namespace detail { - -template struct fwd_or_bidi_tag_impl { - using type = std::forward_iterator_tag; -}; - -template <> struct fwd_or_bidi_tag_impl { - using type = std::bidirectional_iterator_tag; -}; - -/// Helper which sets its type member to forward_iterator_tag if the category -/// of \p IterT does not derive from bidirectional_iterator_tag, and to -/// bidirectional_iterator_tag otherwise. -template struct fwd_or_bidi_tag { - using type = typename fwd_or_bidi_tag_impl::iterator_category>::value>::type; -}; - -} // namespace detail - -/// Defines filter_iterator to a suitable specialization of -/// filter_iterator_impl, based on the underlying iterator's category. -template -using filter_iterator = filter_iterator_impl< - WrappedIteratorT, PredicateT, - typename detail::fwd_or_bidi_tag::type>; - -/// Convenience function that takes a range of elements and a predicate, -/// and return a new filter_iterator range. -/// -/// FIXME: Currently if RangeT && is a rvalue reference to a temporary, the -/// lifetime of that temporary is not kept by the returned range object, and the -/// temporary is going to be dropped on the floor after the make_iterator_range -/// full expression that contains this function call. -template -iterator_range, PredicateT>> -make_filter_range(RangeT &&Range, PredicateT Pred) { - using FilterIteratorT = - filter_iterator, PredicateT>; - return make_range( - FilterIteratorT(std::begin(std::forward(Range)), - std::end(std::forward(Range)), Pred), - FilterIteratorT(std::end(std::forward(Range)), - std::end(std::forward(Range)), Pred)); -} - -// forward declarations required by zip_shortest/zip_first -template -bool all_of(R &&range, UnaryPredicate P); -template -bool any_of(R &&range, UnaryPredicate P); - -namespace detail { - -using std::declval; - -// We have to alias this since inlining the actual type at the usage site -// in the parameter list of iterator_facade_base<> below ICEs MSVC 2017. -template struct ZipTupleType { - using type = std::tuple())...>; -}; - -template -using zip_traits = iterator_facade_base< - ZipType, typename std::common_type::iterator_category...>::type, - // ^ TODO: Implement random access methods. - typename ZipTupleType::type, - typename std::iterator_traits>::type>::difference_type, - // ^ FIXME: This follows boost::make_zip_iterator's assumption that all - // inner iterators have the same difference_type. It would fail if, for - // instance, the second field's difference_type were non-numeric while the - // first is. - typename ZipTupleType::type *, - typename ZipTupleType::type>; - -template -struct zip_common : public zip_traits { - using Base = zip_traits; - using value_type = typename Base::value_type; - - std::tuple iterators; - -protected: - template value_type deref(std::index_sequence) const { - return value_type(*std::get(iterators)...); - } - - template - decltype(iterators) tup_inc(std::index_sequence) const { - return std::tuple(std::next(std::get(iterators))...); - } - - template - decltype(iterators) tup_dec(std::index_sequence) const { - return std::tuple(std::prev(std::get(iterators))...); - } - -public: - zip_common(Iters &&... ts) : iterators(std::forward(ts)...) {} - - value_type operator*() { return deref(std::index_sequence_for{}); } - - const value_type operator*() const { - return deref(std::index_sequence_for{}); - } - - ZipType &operator++() { - iterators = tup_inc(std::index_sequence_for{}); - return *reinterpret_cast(this); - } - - ZipType &operator--() { - static_assert(Base::IsBidirectional, - "All inner iterators must be at least bidirectional."); - iterators = tup_dec(std::index_sequence_for{}); - return *reinterpret_cast(this); - } -}; - -template -struct zip_first : public zip_common, Iters...> { - using Base = zip_common, Iters...>; - - bool operator==(const zip_first &other) const { - return std::get<0>(this->iterators) == std::get<0>(other.iterators); - } - - zip_first(Iters &&... ts) : Base(std::forward(ts)...) {} -}; - -template -class zip_shortest : public zip_common, Iters...> { - template - bool test(const zip_shortest &other, std::index_sequence) const { - return all_of(std::initializer_list{std::get(this->iterators) != - std::get(other.iterators)...}, - identity{}); - } - -public: - using Base = zip_common, Iters...>; - - zip_shortest(Iters &&... ts) : Base(std::forward(ts)...) {} - - bool operator==(const zip_shortest &other) const { - return !test(other, std::index_sequence_for{}); - } -}; - -template