-
Notifications
You must be signed in to change notification settings - Fork 29
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
add andrei alexandrescu's scope guard implementation
- Loading branch information
Showing
2 changed files
with
736 additions
and
0 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 | Original file line | Diff line number | Diff line change |
---|---|---|---|
@@ -0,0 +1,70 @@ | |||
//////////////////////////////////////////////////////////////////////////////// | |||
// The Loki Library | |||
// Copyright (c) 2006 Richard Sposato | |||
// Copyright (c) 2006 Peter Kümmel | |||
// Permission to use, copy, modify, distribute and sell this software for any | |||
// purpose is hereby granted without fee, provided that the above copyright | |||
// notice appear in all copies and that both that copyright notice and this | |||
// permission notice appear in supporting documentation. | |||
// The authors make no representations about the | |||
// suitability of this software for any purpose. It is provided "as is" | |||
// without express or implied warranty. | |||
//////////////////////////////////////////////////////////////////////////////// | |||
#ifndef LOKI_REFTOVALUE_INC_ | |||
#define LOKI_REFTOVALUE_INC_ | |||
|
|||
// $Id: RefToValue.h 751 2006-10-17 19:50:37Z syntheticpp $ | |||
|
|||
|
|||
namespace Loki | |||
{ | |||
|
|||
//////////////////////////////////////////////////////////////////////////////// | |||
/// \class RefToValue | |||
/// | |||
/// \ingroup SmartPointerGroup | |||
/// Transports a reference as a value | |||
/// Serves to implement the Colvin/Gibbons trick for SmartPtr/ScopeGuard | |||
//////////////////////////////////////////////////////////////////////////////// | |||
|
|||
template <class T> | |||
class RefToValue | |||
{ | |||
public: | |||
|
|||
RefToValue(T& ref) : ref_(ref) | |||
{} | |||
|
|||
RefToValue(const RefToValue& rhs) : ref_(rhs.ref_) | |||
{} | |||
|
|||
operator T& () const | |||
{ | |||
return ref_; | |||
} | |||
|
|||
private: | |||
// Disable - not implemented | |||
RefToValue(); | |||
RefToValue& operator=(const RefToValue&); | |||
|
|||
T& ref_; | |||
}; | |||
|
|||
|
|||
//////////////////////////////////////////////////////////////////////////////// | |||
/// \ingroup ExceptionGroup | |||
/// RefToValue creator. | |||
//////////////////////////////////////////////////////////////////////////////// | |||
|
|||
template <class T> | |||
inline RefToValue<T> ByRef(T& t) | |||
{ | |||
return RefToValue<T>(t); | |||
} | |||
|
|||
} | |||
|
|||
|
|||
#endif // end file guardian | |||
|
Oops, something went wrong.