2017-10-31 13:19:12 -04:00
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
|
|
// Copyright (c) 2015 Microsoft Corporation. All rights reserved.
|
|
|
|
//
|
|
|
|
// This code is licensed under the MIT License (MIT).
|
|
|
|
//
|
|
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
|
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
|
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
|
|
// THE SOFTWARE.
|
|
|
|
//
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
#ifndef GSL_POINTERS_H
|
|
|
|
#define GSL_POINTERS_H
|
|
|
|
|
2022-01-31 16:06:42 -05:00
|
|
|
#include "assert" // for Ensures, Expects
|
2017-10-31 13:19:12 -04:00
|
|
|
|
2017-11-28 10:13:49 -05:00
|
|
|
#include <algorithm> // for forward
|
2020-10-28 18:37:02 -04:00
|
|
|
#include <cstddef> // for ptrdiff_t, nullptr_t, size_t
|
2017-11-28 10:13:49 -05:00
|
|
|
#include <memory> // for shared_ptr, unique_ptr
|
|
|
|
#include <system_error> // for hash
|
|
|
|
#include <type_traits> // for enable_if_t, is_convertible, is_assignable
|
2017-10-31 13:19:12 -04:00
|
|
|
|
2020-10-28 18:37:02 -04:00
|
|
|
#if !defined(GSL_NO_IOSTREAMS)
|
2020-10-29 20:38:48 -04:00
|
|
|
#include <iosfwd> // for ostream
|
|
|
|
#endif // !defined(GSL_NO_IOSTREAMS)
|
2020-10-28 18:37:02 -04:00
|
|
|
|
2017-10-31 13:19:12 -04:00
|
|
|
namespace gsl
|
|
|
|
{
|
|
|
|
|
2021-02-24 17:39:13 -05:00
|
|
|
namespace details
|
|
|
|
{
|
2021-05-20 21:18:08 -04:00
|
|
|
template <typename T, typename = void>
|
|
|
|
struct is_comparable_to_nullptr : std::false_type
|
|
|
|
{
|
|
|
|
};
|
|
|
|
|
|
|
|
template <typename T>
|
|
|
|
struct is_comparable_to_nullptr<
|
|
|
|
T,
|
|
|
|
std::enable_if_t<std::is_convertible<decltype(std::declval<T>() != nullptr), bool>::value>>
|
|
|
|
: std::true_type
|
|
|
|
{
|
|
|
|
};
|
2022-10-11 19:49:16 -04:00
|
|
|
|
|
|
|
// Resolves to the more efficient of `const T` or `const T&`, in the context of returning a const-qualified value
|
|
|
|
// of type T.
|
|
|
|
//
|
|
|
|
// Copied from cppfront's implementation of the CppCoreGuidelines F.16 (https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Rf-in)
|
|
|
|
template<typename T>
|
|
|
|
using value_or_reference_return_t = std::conditional_t<
|
|
|
|
sizeof(T) < 2*sizeof(void*) && std::is_trivially_copy_constructible<T>::value,
|
|
|
|
const T,
|
|
|
|
const T&>;
|
|
|
|
|
2021-05-20 21:18:08 -04:00
|
|
|
} // namespace details
|
2021-02-24 17:39:13 -05:00
|
|
|
|
2017-10-31 13:19:12 -04:00
|
|
|
//
|
|
|
|
// GSL.owner: ownership pointers
|
|
|
|
//
|
|
|
|
using std::shared_ptr;
|
2020-10-29 20:38:48 -04:00
|
|
|
using std::unique_ptr;
|
2017-10-31 13:19:12 -04:00
|
|
|
|
|
|
|
//
|
|
|
|
// owner
|
|
|
|
//
|
2020-10-29 20:38:48 -04:00
|
|
|
// owner<T> is designed as a bridge for code that must deal directly with owning pointers for some
|
|
|
|
// reason
|
2017-10-31 13:19:12 -04:00
|
|
|
//
|
|
|
|
// T must be a pointer type
|
|
|
|
// - disallow construction from any type other than pointer type
|
|
|
|
//
|
|
|
|
template <class T, class = std::enable_if_t<std::is_pointer<T>::value>>
|
|
|
|
using owner = T;
|
|
|
|
|
|
|
|
//
|
|
|
|
// not_null
|
|
|
|
//
|
|
|
|
// Restricts a pointer or smart pointer to only hold non-null values.
|
|
|
|
//
|
|
|
|
// Has zero size overhead over T.
|
|
|
|
//
|
|
|
|
// If T is a pointer (i.e. T == U*) then
|
|
|
|
// - allow construction from U*
|
|
|
|
// - disallow construction from nullptr_t
|
|
|
|
// - disallow default construction
|
|
|
|
// - ensure construction from null U* fails
|
|
|
|
// - allow implicit conversion to U*
|
|
|
|
//
|
|
|
|
template <class T>
|
|
|
|
class not_null
|
|
|
|
{
|
|
|
|
public:
|
2021-02-24 17:39:13 -05:00
|
|
|
static_assert(details::is_comparable_to_nullptr<T>::value, "T cannot be compared to nullptr.");
|
2017-10-31 13:19:12 -04:00
|
|
|
|
2017-11-03 19:18:59 -04:00
|
|
|
template <typename U, typename = std::enable_if_t<std::is_convertible<U, T>::value>>
|
Dev/annagrin/remove explicit not null constructor (#743)
* Added c++17 test configurations for clang5.0 and clang6.0
* Removed explicit not_null constructor, sloppy_not_null, added strict_not_null
We added explicit not_null constructor in version 2.0.0.
It proved very difficult to switch to the new version for
large code bases that adopted previous versions of gsl,
due to not_null used extensively in the code. Still, using
explicit constructor is very benefitial for new code, since
it encorages better API design and make null checks intentional.
To resolve the issue, this change:
- removes explicit keyword from not_null constructor
- removes unneded sloppy_not_null type
- adds strict_not_null type to behave the same way as v2 not_null
- updates tests
* Removed explicit not_null constructor, sloppy_not_null, added strict_not_null
We added explicit not_null constructor in version 2.0.0.
It proved very difficult to switch to the new version for
large code bases that adopted previous versions of gsl,
due to not_null used extensively in the code. Still, using
explicit constructor is very benefitial for new code, since
it encorages better API design and make null checks intentional.
To resolve the issue, this change:
- removes explicit keyword from not_null constructor
- removes unneded sloppy_not_null type
- adds strict_not_null type to behave the same way as v2 not_null
- updates tests
* fixed build break for gcc7
* added more tests
* added more non-compiling tests
* Addressed PR comments and suppressed a code analysis warning
* Fixed test failure in not_null tests
2019-01-14 19:45:47 -05:00
|
|
|
constexpr not_null(U&& u) : ptr_(std::forward<U>(u))
|
2017-10-31 13:19:12 -04:00
|
|
|
{
|
|
|
|
Expects(ptr_ != nullptr);
|
2018-06-07 16:36:56 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
template <typename = std::enable_if_t<!std::is_same<std::nullptr_t, T>::value>>
|
2020-08-26 19:51:58 -04:00
|
|
|
constexpr not_null(T u) : ptr_(std::move(u))
|
2018-06-07 16:36:56 -04:00
|
|
|
{
|
|
|
|
Expects(ptr_ != nullptr);
|
2017-10-31 13:19:12 -04:00
|
|
|
}
|
|
|
|
|
2017-11-03 19:18:59 -04:00
|
|
|
template <typename U, typename = std::enable_if_t<std::is_convertible<U, T>::value>>
|
2017-10-31 13:19:12 -04:00
|
|
|
constexpr not_null(const not_null<U>& other) : not_null(other.get())
|
2020-10-29 20:38:48 -04:00
|
|
|
{}
|
2017-10-31 13:19:12 -04:00
|
|
|
|
|
|
|
not_null(const not_null& other) = default;
|
|
|
|
not_null& operator=(const not_null& other) = default;
|
2022-10-11 19:49:16 -04:00
|
|
|
constexpr details::value_or_reference_return_t<T> get() const
|
2017-10-31 13:19:12 -04:00
|
|
|
{
|
|
|
|
Ensures(ptr_ != nullptr);
|
|
|
|
return ptr_;
|
|
|
|
}
|
|
|
|
|
|
|
|
constexpr operator T() const { return get(); }
|
2020-08-26 19:51:58 -04:00
|
|
|
constexpr decltype(auto) operator->() const { return get(); }
|
2019-11-15 15:11:44 -05:00
|
|
|
constexpr decltype(auto) operator*() const { return *get(); }
|
2017-10-31 13:19:12 -04:00
|
|
|
|
|
|
|
// prevents compilation when someone attempts to assign a null pointer constant
|
|
|
|
not_null(std::nullptr_t) = delete;
|
|
|
|
not_null& operator=(std::nullptr_t) = delete;
|
|
|
|
|
|
|
|
// unwanted operators...pointers only point to single objects!
|
|
|
|
not_null& operator++() = delete;
|
|
|
|
not_null& operator--() = delete;
|
|
|
|
not_null operator++(int) = delete;
|
|
|
|
not_null operator--(int) = delete;
|
|
|
|
not_null& operator+=(std::ptrdiff_t) = delete;
|
|
|
|
not_null& operator-=(std::ptrdiff_t) = delete;
|
|
|
|
void operator[](std::ptrdiff_t) const = delete;
|
|
|
|
|
|
|
|
private:
|
|
|
|
T ptr_;
|
|
|
|
};
|
|
|
|
|
2018-08-13 05:22:02 -04:00
|
|
|
template <class T>
|
2020-10-29 20:38:48 -04:00
|
|
|
auto make_not_null(T&& t) noexcept
|
|
|
|
{
|
Dev/annagrin/remove explicit not null constructor (#743)
* Added c++17 test configurations for clang5.0 and clang6.0
* Removed explicit not_null constructor, sloppy_not_null, added strict_not_null
We added explicit not_null constructor in version 2.0.0.
It proved very difficult to switch to the new version for
large code bases that adopted previous versions of gsl,
due to not_null used extensively in the code. Still, using
explicit constructor is very benefitial for new code, since
it encorages better API design and make null checks intentional.
To resolve the issue, this change:
- removes explicit keyword from not_null constructor
- removes unneded sloppy_not_null type
- adds strict_not_null type to behave the same way as v2 not_null
- updates tests
* Removed explicit not_null constructor, sloppy_not_null, added strict_not_null
We added explicit not_null constructor in version 2.0.0.
It proved very difficult to switch to the new version for
large code bases that adopted previous versions of gsl,
due to not_null used extensively in the code. Still, using
explicit constructor is very benefitial for new code, since
it encorages better API design and make null checks intentional.
To resolve the issue, this change:
- removes explicit keyword from not_null constructor
- removes unneded sloppy_not_null type
- adds strict_not_null type to behave the same way as v2 not_null
- updates tests
* fixed build break for gcc7
* added more tests
* added more non-compiling tests
* Addressed PR comments and suppressed a code analysis warning
* Fixed test failure in not_null tests
2019-01-14 19:45:47 -05:00
|
|
|
return not_null<std::remove_cv_t<std::remove_reference_t<T>>>{std::forward<T>(t)};
|
2018-08-13 05:22:02 -04:00
|
|
|
}
|
|
|
|
|
2020-10-28 18:37:02 -04:00
|
|
|
#if !defined(GSL_NO_IOSTREAMS)
|
2017-10-31 13:19:12 -04:00
|
|
|
template <class T>
|
|
|
|
std::ostream& operator<<(std::ostream& os, const not_null<T>& val)
|
|
|
|
{
|
|
|
|
os << val.get();
|
|
|
|
return os;
|
|
|
|
}
|
2020-10-28 18:37:02 -04:00
|
|
|
#endif // !defined(GSL_NO_IOSTREAMS)
|
2017-10-31 13:19:12 -04:00
|
|
|
|
|
|
|
template <class T, class U>
|
2020-10-29 20:38:48 -04:00
|
|
|
auto operator==(const not_null<T>& lhs,
|
|
|
|
const not_null<U>& rhs) noexcept(noexcept(lhs.get() == rhs.get()))
|
|
|
|
-> decltype(lhs.get() == rhs.get())
|
2017-10-31 13:19:12 -04:00
|
|
|
{
|
|
|
|
return lhs.get() == rhs.get();
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class T, class U>
|
2020-10-29 20:38:48 -04:00
|
|
|
auto operator!=(const not_null<T>& lhs,
|
|
|
|
const not_null<U>& rhs) noexcept(noexcept(lhs.get() != rhs.get()))
|
|
|
|
-> decltype(lhs.get() != rhs.get())
|
2017-10-31 13:19:12 -04:00
|
|
|
{
|
|
|
|
return lhs.get() != rhs.get();
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class T, class U>
|
2020-10-29 20:38:48 -04:00
|
|
|
auto operator<(const not_null<T>& lhs,
|
|
|
|
const not_null<U>& rhs) noexcept(noexcept(lhs.get() < rhs.get()))
|
|
|
|
-> decltype(lhs.get() < rhs.get())
|
2017-10-31 13:19:12 -04:00
|
|
|
{
|
|
|
|
return lhs.get() < rhs.get();
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class T, class U>
|
2020-10-29 20:38:48 -04:00
|
|
|
auto operator<=(const not_null<T>& lhs,
|
|
|
|
const not_null<U>& rhs) noexcept(noexcept(lhs.get() <= rhs.get()))
|
|
|
|
-> decltype(lhs.get() <= rhs.get())
|
2017-10-31 13:19:12 -04:00
|
|
|
{
|
|
|
|
return lhs.get() <= rhs.get();
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class T, class U>
|
2020-10-29 20:38:48 -04:00
|
|
|
auto operator>(const not_null<T>& lhs,
|
|
|
|
const not_null<U>& rhs) noexcept(noexcept(lhs.get() > rhs.get()))
|
|
|
|
-> decltype(lhs.get() > rhs.get())
|
2017-10-31 13:19:12 -04:00
|
|
|
{
|
|
|
|
return lhs.get() > rhs.get();
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class T, class U>
|
2020-10-29 20:38:48 -04:00
|
|
|
auto operator>=(const not_null<T>& lhs,
|
|
|
|
const not_null<U>& rhs) noexcept(noexcept(lhs.get() >= rhs.get()))
|
|
|
|
-> decltype(lhs.get() >= rhs.get())
|
2017-10-31 13:19:12 -04:00
|
|
|
{
|
|
|
|
return lhs.get() >= rhs.get();
|
|
|
|
}
|
|
|
|
|
|
|
|
// more unwanted operators
|
|
|
|
template <class T, class U>
|
|
|
|
std::ptrdiff_t operator-(const not_null<T>&, const not_null<U>&) = delete;
|
|
|
|
template <class T>
|
|
|
|
not_null<T> operator-(const not_null<T>&, std::ptrdiff_t) = delete;
|
|
|
|
template <class T>
|
|
|
|
not_null<T> operator+(const not_null<T>&, std::ptrdiff_t) = delete;
|
|
|
|
template <class T>
|
|
|
|
not_null<T> operator+(std::ptrdiff_t, const not_null<T>&) = delete;
|
|
|
|
|
|
|
|
} // namespace gsl
|
|
|
|
|
|
|
|
namespace std
|
|
|
|
{
|
|
|
|
template <class T>
|
|
|
|
struct hash<gsl::not_null<T>>
|
|
|
|
{
|
2020-08-13 07:55:17 -04:00
|
|
|
std::size_t operator()(const gsl::not_null<T>& value) const { return hash<T>{}(value.get()); }
|
2017-10-31 13:19:12 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace std
|
|
|
|
|
Dev/annagrin/remove explicit not null constructor (#743)
* Added c++17 test configurations for clang5.0 and clang6.0
* Removed explicit not_null constructor, sloppy_not_null, added strict_not_null
We added explicit not_null constructor in version 2.0.0.
It proved very difficult to switch to the new version for
large code bases that adopted previous versions of gsl,
due to not_null used extensively in the code. Still, using
explicit constructor is very benefitial for new code, since
it encorages better API design and make null checks intentional.
To resolve the issue, this change:
- removes explicit keyword from not_null constructor
- removes unneded sloppy_not_null type
- adds strict_not_null type to behave the same way as v2 not_null
- updates tests
* Removed explicit not_null constructor, sloppy_not_null, added strict_not_null
We added explicit not_null constructor in version 2.0.0.
It proved very difficult to switch to the new version for
large code bases that adopted previous versions of gsl,
due to not_null used extensively in the code. Still, using
explicit constructor is very benefitial for new code, since
it encorages better API design and make null checks intentional.
To resolve the issue, this change:
- removes explicit keyword from not_null constructor
- removes unneded sloppy_not_null type
- adds strict_not_null type to behave the same way as v2 not_null
- updates tests
* fixed build break for gcc7
* added more tests
* added more non-compiling tests
* Addressed PR comments and suppressed a code analysis warning
* Fixed test failure in not_null tests
2019-01-14 19:45:47 -05:00
|
|
|
namespace gsl
|
|
|
|
{
|
|
|
|
|
|
|
|
//
|
|
|
|
// strict_not_null
|
|
|
|
//
|
|
|
|
// Restricts a pointer or smart pointer to only hold non-null values,
|
|
|
|
//
|
2019-10-06 12:20:15 -04:00
|
|
|
// - provides a strict (i.e. explicit constructor from T) wrapper of not_null
|
Dev/annagrin/remove explicit not null constructor (#743)
* Added c++17 test configurations for clang5.0 and clang6.0
* Removed explicit not_null constructor, sloppy_not_null, added strict_not_null
We added explicit not_null constructor in version 2.0.0.
It proved very difficult to switch to the new version for
large code bases that adopted previous versions of gsl,
due to not_null used extensively in the code. Still, using
explicit constructor is very benefitial for new code, since
it encorages better API design and make null checks intentional.
To resolve the issue, this change:
- removes explicit keyword from not_null constructor
- removes unneded sloppy_not_null type
- adds strict_not_null type to behave the same way as v2 not_null
- updates tests
* Removed explicit not_null constructor, sloppy_not_null, added strict_not_null
We added explicit not_null constructor in version 2.0.0.
It proved very difficult to switch to the new version for
large code bases that adopted previous versions of gsl,
due to not_null used extensively in the code. Still, using
explicit constructor is very benefitial for new code, since
it encorages better API design and make null checks intentional.
To resolve the issue, this change:
- removes explicit keyword from not_null constructor
- removes unneded sloppy_not_null type
- adds strict_not_null type to behave the same way as v2 not_null
- updates tests
* fixed build break for gcc7
* added more tests
* added more non-compiling tests
* Addressed PR comments and suppressed a code analysis warning
* Fixed test failure in not_null tests
2019-01-14 19:45:47 -05:00
|
|
|
// - to be used for new code that wishes the design to be cleaner and make not_null
|
|
|
|
// checks intentional, or in old code that would like to make the transition.
|
|
|
|
//
|
|
|
|
// To make the transition from not_null, incrementally replace not_null
|
|
|
|
// by strict_not_null and fix compilation errors
|
|
|
|
//
|
|
|
|
// Expect to
|
2019-10-06 12:20:15 -04:00
|
|
|
// - remove all unneeded conversions from raw pointer to not_null and back
|
|
|
|
// - make API clear by specifying not_null in parameters where needed
|
|
|
|
// - remove unnecessary asserts
|
Dev/annagrin/remove explicit not null constructor (#743)
* Added c++17 test configurations for clang5.0 and clang6.0
* Removed explicit not_null constructor, sloppy_not_null, added strict_not_null
We added explicit not_null constructor in version 2.0.0.
It proved very difficult to switch to the new version for
large code bases that adopted previous versions of gsl,
due to not_null used extensively in the code. Still, using
explicit constructor is very benefitial for new code, since
it encorages better API design and make null checks intentional.
To resolve the issue, this change:
- removes explicit keyword from not_null constructor
- removes unneded sloppy_not_null type
- adds strict_not_null type to behave the same way as v2 not_null
- updates tests
* Removed explicit not_null constructor, sloppy_not_null, added strict_not_null
We added explicit not_null constructor in version 2.0.0.
It proved very difficult to switch to the new version for
large code bases that adopted previous versions of gsl,
due to not_null used extensively in the code. Still, using
explicit constructor is very benefitial for new code, since
it encorages better API design and make null checks intentional.
To resolve the issue, this change:
- removes explicit keyword from not_null constructor
- removes unneded sloppy_not_null type
- adds strict_not_null type to behave the same way as v2 not_null
- updates tests
* fixed build break for gcc7
* added more tests
* added more non-compiling tests
* Addressed PR comments and suppressed a code analysis warning
* Fixed test failure in not_null tests
2019-01-14 19:45:47 -05:00
|
|
|
//
|
|
|
|
template <class T>
|
2020-10-29 20:38:48 -04:00
|
|
|
class strict_not_null : public not_null<T>
|
Dev/annagrin/remove explicit not null constructor (#743)
* Added c++17 test configurations for clang5.0 and clang6.0
* Removed explicit not_null constructor, sloppy_not_null, added strict_not_null
We added explicit not_null constructor in version 2.0.0.
It proved very difficult to switch to the new version for
large code bases that adopted previous versions of gsl,
due to not_null used extensively in the code. Still, using
explicit constructor is very benefitial for new code, since
it encorages better API design and make null checks intentional.
To resolve the issue, this change:
- removes explicit keyword from not_null constructor
- removes unneded sloppy_not_null type
- adds strict_not_null type to behave the same way as v2 not_null
- updates tests
* Removed explicit not_null constructor, sloppy_not_null, added strict_not_null
We added explicit not_null constructor in version 2.0.0.
It proved very difficult to switch to the new version for
large code bases that adopted previous versions of gsl,
due to not_null used extensively in the code. Still, using
explicit constructor is very benefitial for new code, since
it encorages better API design and make null checks intentional.
To resolve the issue, this change:
- removes explicit keyword from not_null constructor
- removes unneded sloppy_not_null type
- adds strict_not_null type to behave the same way as v2 not_null
- updates tests
* fixed build break for gcc7
* added more tests
* added more non-compiling tests
* Addressed PR comments and suppressed a code analysis warning
* Fixed test failure in not_null tests
2019-01-14 19:45:47 -05:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
template <typename U, typename = std::enable_if_t<std::is_convertible<U, T>::value>>
|
2020-10-29 20:38:48 -04:00
|
|
|
constexpr explicit strict_not_null(U&& u) : not_null<T>(std::forward<U>(u))
|
Dev/annagrin/remove explicit not null constructor (#743)
* Added c++17 test configurations for clang5.0 and clang6.0
* Removed explicit not_null constructor, sloppy_not_null, added strict_not_null
We added explicit not_null constructor in version 2.0.0.
It proved very difficult to switch to the new version for
large code bases that adopted previous versions of gsl,
due to not_null used extensively in the code. Still, using
explicit constructor is very benefitial for new code, since
it encorages better API design and make null checks intentional.
To resolve the issue, this change:
- removes explicit keyword from not_null constructor
- removes unneded sloppy_not_null type
- adds strict_not_null type to behave the same way as v2 not_null
- updates tests
* Removed explicit not_null constructor, sloppy_not_null, added strict_not_null
We added explicit not_null constructor in version 2.0.0.
It proved very difficult to switch to the new version for
large code bases that adopted previous versions of gsl,
due to not_null used extensively in the code. Still, using
explicit constructor is very benefitial for new code, since
it encorages better API design and make null checks intentional.
To resolve the issue, this change:
- removes explicit keyword from not_null constructor
- removes unneded sloppy_not_null type
- adds strict_not_null type to behave the same way as v2 not_null
- updates tests
* fixed build break for gcc7
* added more tests
* added more non-compiling tests
* Addressed PR comments and suppressed a code analysis warning
* Fixed test failure in not_null tests
2019-01-14 19:45:47 -05:00
|
|
|
{}
|
|
|
|
|
|
|
|
template <typename = std::enable_if_t<!std::is_same<std::nullptr_t, T>::value>>
|
2020-10-29 20:38:48 -04:00
|
|
|
constexpr explicit strict_not_null(T u) : not_null<T>(u)
|
Dev/annagrin/remove explicit not null constructor (#743)
* Added c++17 test configurations for clang5.0 and clang6.0
* Removed explicit not_null constructor, sloppy_not_null, added strict_not_null
We added explicit not_null constructor in version 2.0.0.
It proved very difficult to switch to the new version for
large code bases that adopted previous versions of gsl,
due to not_null used extensively in the code. Still, using
explicit constructor is very benefitial for new code, since
it encorages better API design and make null checks intentional.
To resolve the issue, this change:
- removes explicit keyword from not_null constructor
- removes unneded sloppy_not_null type
- adds strict_not_null type to behave the same way as v2 not_null
- updates tests
* Removed explicit not_null constructor, sloppy_not_null, added strict_not_null
We added explicit not_null constructor in version 2.0.0.
It proved very difficult to switch to the new version for
large code bases that adopted previous versions of gsl,
due to not_null used extensively in the code. Still, using
explicit constructor is very benefitial for new code, since
it encorages better API design and make null checks intentional.
To resolve the issue, this change:
- removes explicit keyword from not_null constructor
- removes unneded sloppy_not_null type
- adds strict_not_null type to behave the same way as v2 not_null
- updates tests
* fixed build break for gcc7
* added more tests
* added more non-compiling tests
* Addressed PR comments and suppressed a code analysis warning
* Fixed test failure in not_null tests
2019-01-14 19:45:47 -05:00
|
|
|
{}
|
|
|
|
|
|
|
|
template <typename U, typename = std::enable_if_t<std::is_convertible<U, T>::value>>
|
2020-10-29 20:38:48 -04:00
|
|
|
constexpr strict_not_null(const not_null<U>& other) : not_null<T>(other)
|
Dev/annagrin/remove explicit not null constructor (#743)
* Added c++17 test configurations for clang5.0 and clang6.0
* Removed explicit not_null constructor, sloppy_not_null, added strict_not_null
We added explicit not_null constructor in version 2.0.0.
It proved very difficult to switch to the new version for
large code bases that adopted previous versions of gsl,
due to not_null used extensively in the code. Still, using
explicit constructor is very benefitial for new code, since
it encorages better API design and make null checks intentional.
To resolve the issue, this change:
- removes explicit keyword from not_null constructor
- removes unneded sloppy_not_null type
- adds strict_not_null type to behave the same way as v2 not_null
- updates tests
* Removed explicit not_null constructor, sloppy_not_null, added strict_not_null
We added explicit not_null constructor in version 2.0.0.
It proved very difficult to switch to the new version for
large code bases that adopted previous versions of gsl,
due to not_null used extensively in the code. Still, using
explicit constructor is very benefitial for new code, since
it encorages better API design and make null checks intentional.
To resolve the issue, this change:
- removes explicit keyword from not_null constructor
- removes unneded sloppy_not_null type
- adds strict_not_null type to behave the same way as v2 not_null
- updates tests
* fixed build break for gcc7
* added more tests
* added more non-compiling tests
* Addressed PR comments and suppressed a code analysis warning
* Fixed test failure in not_null tests
2019-01-14 19:45:47 -05:00
|
|
|
{}
|
|
|
|
|
|
|
|
template <typename U, typename = std::enable_if_t<std::is_convertible<U, T>::value>>
|
2020-10-29 20:38:48 -04:00
|
|
|
constexpr strict_not_null(const strict_not_null<U>& other) : not_null<T>(other)
|
Dev/annagrin/remove explicit not null constructor (#743)
* Added c++17 test configurations for clang5.0 and clang6.0
* Removed explicit not_null constructor, sloppy_not_null, added strict_not_null
We added explicit not_null constructor in version 2.0.0.
It proved very difficult to switch to the new version for
large code bases that adopted previous versions of gsl,
due to not_null used extensively in the code. Still, using
explicit constructor is very benefitial for new code, since
it encorages better API design and make null checks intentional.
To resolve the issue, this change:
- removes explicit keyword from not_null constructor
- removes unneded sloppy_not_null type
- adds strict_not_null type to behave the same way as v2 not_null
- updates tests
* Removed explicit not_null constructor, sloppy_not_null, added strict_not_null
We added explicit not_null constructor in version 2.0.0.
It proved very difficult to switch to the new version for
large code bases that adopted previous versions of gsl,
due to not_null used extensively in the code. Still, using
explicit constructor is very benefitial for new code, since
it encorages better API design and make null checks intentional.
To resolve the issue, this change:
- removes explicit keyword from not_null constructor
- removes unneded sloppy_not_null type
- adds strict_not_null type to behave the same way as v2 not_null
- updates tests
* fixed build break for gcc7
* added more tests
* added more non-compiling tests
* Addressed PR comments and suppressed a code analysis warning
* Fixed test failure in not_null tests
2019-01-14 19:45:47 -05:00
|
|
|
{}
|
|
|
|
|
|
|
|
strict_not_null(strict_not_null&& other) = default;
|
|
|
|
strict_not_null(const strict_not_null& other) = default;
|
|
|
|
strict_not_null& operator=(const strict_not_null& other) = default;
|
|
|
|
strict_not_null& operator=(const not_null<T>& other)
|
|
|
|
{
|
|
|
|
not_null<T>::operator=(other);
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
|
|
|
// prevents compilation when someone attempts to assign a null pointer constant
|
|
|
|
strict_not_null(std::nullptr_t) = delete;
|
|
|
|
strict_not_null& operator=(std::nullptr_t) = delete;
|
|
|
|
|
|
|
|
// unwanted operators...pointers only point to single objects!
|
|
|
|
strict_not_null& operator++() = delete;
|
|
|
|
strict_not_null& operator--() = delete;
|
|
|
|
strict_not_null operator++(int) = delete;
|
|
|
|
strict_not_null operator--(int) = delete;
|
|
|
|
strict_not_null& operator+=(std::ptrdiff_t) = delete;
|
|
|
|
strict_not_null& operator-=(std::ptrdiff_t) = delete;
|
|
|
|
void operator[](std::ptrdiff_t) const = delete;
|
|
|
|
};
|
|
|
|
|
|
|
|
// more unwanted operators
|
|
|
|
template <class T, class U>
|
|
|
|
std::ptrdiff_t operator-(const strict_not_null<T>&, const strict_not_null<U>&) = delete;
|
|
|
|
template <class T>
|
|
|
|
strict_not_null<T> operator-(const strict_not_null<T>&, std::ptrdiff_t) = delete;
|
|
|
|
template <class T>
|
|
|
|
strict_not_null<T> operator+(const strict_not_null<T>&, std::ptrdiff_t) = delete;
|
|
|
|
template <class T>
|
|
|
|
strict_not_null<T> operator+(std::ptrdiff_t, const strict_not_null<T>&) = delete;
|
|
|
|
|
|
|
|
template <class T>
|
2020-10-29 20:38:48 -04:00
|
|
|
auto make_strict_not_null(T&& t) noexcept
|
|
|
|
{
|
Dev/annagrin/remove explicit not null constructor (#743)
* Added c++17 test configurations for clang5.0 and clang6.0
* Removed explicit not_null constructor, sloppy_not_null, added strict_not_null
We added explicit not_null constructor in version 2.0.0.
It proved very difficult to switch to the new version for
large code bases that adopted previous versions of gsl,
due to not_null used extensively in the code. Still, using
explicit constructor is very benefitial for new code, since
it encorages better API design and make null checks intentional.
To resolve the issue, this change:
- removes explicit keyword from not_null constructor
- removes unneded sloppy_not_null type
- adds strict_not_null type to behave the same way as v2 not_null
- updates tests
* Removed explicit not_null constructor, sloppy_not_null, added strict_not_null
We added explicit not_null constructor in version 2.0.0.
It proved very difficult to switch to the new version for
large code bases that adopted previous versions of gsl,
due to not_null used extensively in the code. Still, using
explicit constructor is very benefitial for new code, since
it encorages better API design and make null checks intentional.
To resolve the issue, this change:
- removes explicit keyword from not_null constructor
- removes unneded sloppy_not_null type
- adds strict_not_null type to behave the same way as v2 not_null
- updates tests
* fixed build break for gcc7
* added more tests
* added more non-compiling tests
* Addressed PR comments and suppressed a code analysis warning
* Fixed test failure in not_null tests
2019-01-14 19:45:47 -05:00
|
|
|
return strict_not_null<std::remove_cv_t<std::remove_reference_t<T>>>{std::forward<T>(t)};
|
|
|
|
}
|
|
|
|
|
2020-10-29 20:38:48 -04:00
|
|
|
#if (defined(__cpp_deduction_guides) && (__cpp_deduction_guides >= 201611L))
|
2019-11-15 17:41:38 -05:00
|
|
|
|
|
|
|
// deduction guides to prevent the ctad-maybe-unsupported warning
|
2020-10-29 20:38:48 -04:00
|
|
|
template <class T>
|
|
|
|
not_null(T) -> not_null<T>;
|
|
|
|
template <class T>
|
|
|
|
strict_not_null(T) -> strict_not_null<T>;
|
2019-11-15 17:41:38 -05:00
|
|
|
|
2019-11-18 14:39:36 -05:00
|
|
|
#endif // ( defined(__cpp_deduction_guides) && (__cpp_deduction_guides >= 201611L) )
|
2019-11-15 17:41:38 -05:00
|
|
|
|
Dev/annagrin/remove explicit not null constructor (#743)
* Added c++17 test configurations for clang5.0 and clang6.0
* Removed explicit not_null constructor, sloppy_not_null, added strict_not_null
We added explicit not_null constructor in version 2.0.0.
It proved very difficult to switch to the new version for
large code bases that adopted previous versions of gsl,
due to not_null used extensively in the code. Still, using
explicit constructor is very benefitial for new code, since
it encorages better API design and make null checks intentional.
To resolve the issue, this change:
- removes explicit keyword from not_null constructor
- removes unneded sloppy_not_null type
- adds strict_not_null type to behave the same way as v2 not_null
- updates tests
* Removed explicit not_null constructor, sloppy_not_null, added strict_not_null
We added explicit not_null constructor in version 2.0.0.
It proved very difficult to switch to the new version for
large code bases that adopted previous versions of gsl,
due to not_null used extensively in the code. Still, using
explicit constructor is very benefitial for new code, since
it encorages better API design and make null checks intentional.
To resolve the issue, this change:
- removes explicit keyword from not_null constructor
- removes unneded sloppy_not_null type
- adds strict_not_null type to behave the same way as v2 not_null
- updates tests
* fixed build break for gcc7
* added more tests
* added more non-compiling tests
* Addressed PR comments and suppressed a code analysis warning
* Fixed test failure in not_null tests
2019-01-14 19:45:47 -05:00
|
|
|
} // namespace gsl
|
|
|
|
|
|
|
|
namespace std
|
|
|
|
{
|
|
|
|
template <class T>
|
|
|
|
struct hash<gsl::strict_not_null<T>>
|
|
|
|
{
|
2020-10-29 20:38:48 -04:00
|
|
|
std::size_t operator()(const gsl::strict_not_null<T>& value) const
|
|
|
|
{
|
|
|
|
return hash<T>{}(value.get());
|
|
|
|
}
|
Dev/annagrin/remove explicit not null constructor (#743)
* Added c++17 test configurations for clang5.0 and clang6.0
* Removed explicit not_null constructor, sloppy_not_null, added strict_not_null
We added explicit not_null constructor in version 2.0.0.
It proved very difficult to switch to the new version for
large code bases that adopted previous versions of gsl,
due to not_null used extensively in the code. Still, using
explicit constructor is very benefitial for new code, since
it encorages better API design and make null checks intentional.
To resolve the issue, this change:
- removes explicit keyword from not_null constructor
- removes unneded sloppy_not_null type
- adds strict_not_null type to behave the same way as v2 not_null
- updates tests
* Removed explicit not_null constructor, sloppy_not_null, added strict_not_null
We added explicit not_null constructor in version 2.0.0.
It proved very difficult to switch to the new version for
large code bases that adopted previous versions of gsl,
due to not_null used extensively in the code. Still, using
explicit constructor is very benefitial for new code, since
it encorages better API design and make null checks intentional.
To resolve the issue, this change:
- removes explicit keyword from not_null constructor
- removes unneded sloppy_not_null type
- adds strict_not_null type to behave the same way as v2 not_null
- updates tests
* fixed build break for gcc7
* added more tests
* added more non-compiling tests
* Addressed PR comments and suppressed a code analysis warning
* Fixed test failure in not_null tests
2019-01-14 19:45:47 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace std
|
2019-01-15 13:27:34 -05:00
|
|
|
|
2017-10-31 13:19:12 -04:00
|
|
|
#endif // GSL_POINTERS_H
|