-
Notifications
You must be signed in to change notification settings - Fork 740
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
added transition helper sloppy_not_null
- Loading branch information
Anna Gringauze
committed
Aug 13, 2018
1 parent
667bff1
commit e1923d0
Showing
2 changed files
with
202 additions
and
10 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,115 @@ | ||
/////////////////////////////////////////////////////////////////////////////// | ||
// | ||
// 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_TRANSITION_H | ||
#define GSL_TRANSITION_H | ||
|
||
#include <gsl/gsl_assert> // for Ensures, Expects | ||
#include <gsl/pointers> // for not_null | ||
|
||
#if defined(_MSC_VER) && _MSC_VER < 1910 | ||
#pragma push_macro("constexpr") | ||
#define constexpr /*constexpr*/ | ||
|
||
#endif // defined(_MSC_VER) && _MSC_VER < 1910 | ||
|
||
namespace gsl | ||
{ | ||
// | ||
// sloppy_not_null | ||
// | ||
// Restricts a pointer or smart pointer to only hold non-null values, | ||
// | ||
// - provides a sloppy (i.e. no explicit contructor from T) wrapper of not_null | ||
// - is temporary, only to be used to incrementally transition of code | ||
// using older version of not_null to the new one that made the constructor explicit | ||
// | ||
// To make the transition: | ||
// | ||
// - replace all occurences of not_null in your code by sloppy_not_null | ||
// - compile - compilation should be successful | ||
// - replace some sloppy_not_nulls by not_null, fix compilation erros, | ||
// redesign as needed, compile and test | ||
// - repeat until no sloppy_not_nulls remain | ||
// | ||
template <class T> | ||
class sloppy_not_null: public not_null<T> | ||
{ | ||
public: | ||
|
||
template <typename U, typename = std::enable_if_t<std::is_convertible<U, T>::value>> | ||
constexpr sloppy_not_null(U&& u) : | ||
not_null(std::forward<U>(u)) | ||
{} | ||
|
||
template <typename = std::enable_if_t<!std::is_same<std::nullptr_t, T>::value>> | ||
constexpr sloppy_not_null(T u) : | ||
not_null(u) | ||
{} | ||
|
||
template <typename U, typename = std::enable_if_t<std::is_convertible<U, T>::value>> | ||
constexpr sloppy_not_null(const not_null<U>& other) : | ||
not_null(other) | ||
{} | ||
|
||
sloppy_not_null(sloppy_not_null&& other) = default; | ||
sloppy_not_null(const sloppy_not_null& other) = default; | ||
sloppy_not_null& operator=(const sloppy_not_null& other) = default; | ||
|
||
// prevents compilation when someone attempts to assign a null pointer constant | ||
sloppy_not_null(std::nullptr_t) = delete; | ||
sloppy_not_null& operator=(std::nullptr_t) = delete; | ||
|
||
// unwanted operators...pointers only point to single objects! | ||
sloppy_not_null& operator++() = delete; | ||
sloppy_not_null& operator--() = delete; | ||
sloppy_not_null operator++(int) = delete; | ||
sloppy_not_null operator--(int) = delete; | ||
sloppy_not_null& operator+=(std::ptrdiff_t) = delete; | ||
sloppy_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 sloppy_not_null<T>&, const sloppy_not_null<U>&) = delete; | ||
template <class T> | ||
sloppy_not_null<T> operator-(const sloppy_not_null<T>&, std::ptrdiff_t) = delete; | ||
template <class T> | ||
sloppy_not_null<T> operator+(const sloppy_not_null<T>&, std::ptrdiff_t) = delete; | ||
template <class T> | ||
sloppy_not_null<T> operator+(std::ptrdiff_t, const sloppy_not_null<T>&) = delete; | ||
|
||
} // namespace gsl | ||
|
||
namespace std | ||
{ | ||
template <class T> | ||
struct hash<gsl::sloppy_not_null<T>> | ||
{ | ||
std::size_t operator()(const gsl::sloppy_not_null<T>& value) const { return hash<T>{}(value); } | ||
}; | ||
|
||
} // namespace std | ||
|
||
#if defined(_MSC_VER) && _MSC_VER < 1910 | ||
#undef constexpr | ||
#pragma pop_macro("constexpr") | ||
|
||
#endif // defined(_MSC_VER) && _MSC_VER < 1910 | ||
|
||
#endif // GSL_TRANSITION_H | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters