VeraCrypt
aboutsummaryrefslogtreecommitdiff
path: root/doc
AgeCommit message (Expand)AuthorFilesLines
2017-06-29Documentation: Add documentation for newly added /secureDesktop command line ...Mounir IDRASSI2-0/+5
2017-06-29Revert "Documentation: Update chm file to match the one included in the offic...Mounir IDRASSI1-0/+0
2017-06-29Documentation: Update chm file to match the one included in the official inst...Mounir IDRASSI1-0/+0
2017-06-05Delete pdf and odt files of User Guide since they are not used anymore.Mounir IDRASSI2-0/+0
2017-06-05Documentation: Add chm file containing the documentation and scripts needed t...Mounir IDRASSI5-0/+615
2017-06-05Documentation: Add https://www.veracrypt.fr/code to the list of VeraCrypt Git...Mounir IDRASSI1-4/+8
2017-06-05Documentation: add title to main HTML pageMounir IDRASSI1-0/+1
2017-06-02Documentation:fix Tibit donation linkMounir IDRASSI1-1/+1
2017-06-02Documentation: fix typo in link nameMounir IDRASSI1-1/+1
2017-06-01Move PDF of User Guide to "doc" folderMounir IDRASSI1-0/+0
2017-05-15Add donation HTML pageMounir IDRASSI10-0/+104
2017-05-15Add HTML documentation.Mounir IDRASSI149-0/+10252
2017-01-12User Guide: fix spelling errors.Mounir IDRASSI1-0/+0
2016-12-30Increment version to 1.20 BETA2 (1.20.2)Mounir IDRASSI1-0/+0
2016-10-17Update User GuideVeraCrypt_1.19Mounir IDRASSI1-0/+0
2016-10-17Windows: Support EFI system encryption for 32-bit Windows.Mounir IDRASSI1-0/+0
2016-10-17Update user guide.Mounir IDRASSI1-0/+0
2016-10-17Increment version to 1.19 (1.19.4)Mounir IDRASSI1-0/+0
2016-10-17Update documentation and increment version to 1.19 BETA3 (1.19.3)Mounir IDRASSI1-0/+0
2016-08-21Increment version to 1.19 BETA2 (1.19.2)Mounir IDRASSI1-0/+0
2016-08-17Add reference of new algorithms introduced in version 1.18 (Camellia, Streebo...Mounir IDRASSI1-0/+0
2016-08-17Update 1.18 release dateMounir IDRASSI1-0/+0
2016-08-16Increment version to 1.18. Update user guide PDF file.VeraCrypt_1.18_PreReleaseMounir IDRASSI1-0/+0
2016-08-15Documentation update.Mounir IDRASSI1-0/+0
2016-08-15User Guide: further corrections and modifications to match online documentation.Mounir IDRASSI1-0/+0
2016-07-24User Guide: Update User Guide odt file to match online documentation and FAQ.Mounir IDRASSI1-0/+0
2016-05-05Update documentation with latest changes (changelog, wait dialog option).Mounir IDRASSI1-0/+0
2016-05-02Add User Guide in OpenDocument format and Update its PDF.Mounir IDRASSI1-0/+0
} /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
/*
 Derived from source code of TrueCrypt 7.1a, which is
 Copyright (c) 2008-2012 TrueCrypt Developers Association and which is governed
 by the TrueCrypt License 3.0.

 Modifications and additions to the original source code (contained in this file)
 and all other portions of this file are Copyright (c) 2013-2016 IDRIX
 and are governed by the Apache License 2.0 the full text of which is
 contained in the file License.txt included in VeraCrypt binary and source
 code distribution packages.
*/

#ifndef TC_HEADER_Platform_SharedPtr
#define TC_HEADER_Platform_SharedPtr

#include <stdexcept>
#include "SharedVal.h"

#ifdef nullptr

namespace VeraCrypt
{
	template <class T>
	class SharedPtr
	{
	public:
		explicit SharedPtr ()
			: Pointer (nullptr), UseCount (nullptr) { }

		explicit SharedPtr (T *pointer)
			: Pointer (pointer), UseCount (new SharedVal <uint64> (1)) { }

		SharedPtr (const SharedPtr &source)
		{
			CopyFrom (source);
		}

		~SharedPtr ()
		{
			Release();
		}

		SharedPtr &operator= (const SharedPtr &source)
		{
			if (&source == this)
				return *this;

			Release();
			CopyFrom (source);
			return *this;
		}

		bool operator == (const SharedPtr &other)
		{
			return get() == other.get();
		}

		bool operator != (const SharedPtr &other)
		{
			return get() != other.get();
		}

		T &operator* () const
		{
#ifdef DEBUG
			if (Pointer == nullptr)
				throw std::runtime_error (SRC_POS);
#endif
			return *Pointer;
		}

		T *operator-> () const
		{
#ifdef DEBUG
			if (Pointer == nullptr)
				throw std::runtime_error (SRC_POS);
#endif
			return Pointer;
		}

		operator bool () const
		{
			return Pointer != nullptr;
		}

		T *get () const
		{
			return Pointer;
		}

		void reset ()
		{
			Release();
		}

		void reset (T *pointer)
		{
			*this = SharedPtr (pointer);
		}

		uint64 use_count () const
		{
			if (!UseCount)
				return 0;

			return *UseCount;
		}

	protected:
		void CopyFrom (const SharedPtr &source)
		{
			Pointer = source.Pointer;
			UseCount = source.UseCount;

			if (UseCount)
				UseCount->Increment();
		}

		void Release ()
		{
			if (UseCount != nullptr)
			{
				if (UseCount->Decrement() == 0)
				{
					if (Pointer != nullptr)
						delete Pointer;
					delete UseCount;
				}

				Pointer = nullptr;
				UseCount = nullptr;
			}
		}

		T *Pointer;
		SharedVal <uint64> *UseCount;
	};

#ifdef shared_ptr
#undef shared_ptr
#endif
#define shared_ptr VeraCrypt::SharedPtr

#ifdef make_shared
#undef make_shared
#endif

	template <class T> shared_ptr <T> make_shared ()
	{
		return shared_ptr <T> (new T ());
	}

	template <class T, class A> shared_ptr <T> make_shared (const A &arg)
	{
		return shared_ptr <T> (new T (arg));
	}

#define make_shared VeraCrypt::make_shared

}

#endif // nullptr

#define make_shared_auto(typeName,instanceName) shared_ptr <typeName> instanceName (new typeName ())

#endif // TC_HEADER_Platform_SharedPtr