Files
Iain Buclaw f5351b38a8 d: Merge upstream dmd, druntime 66b93fc24a, phobos 0c28620c3
Synchronizing with the upstream release of v2.109.1.

D front-end changes:

	- Import dmd v2.109.1.
	- Copying from `const(void)[]' to `void[]' is now disallowed
	  with `-fpreview=fiximmutableconv'.
	- Import expressions are now treated as hex strings.
	- Using boolean values other than 0 or 1 in `@safe' code is now
	  deprecated.

D runtime changes:

	- Import dmd v2.109.1.

Phobos changes:

	- Import dmd v2.109.1.

gcc/d/ChangeLog:

	* dmd/MERGE: Merge upstream dmd 66b93fc24a.
	* dmd/VERSION: Bump version to v2.109.1.
	* d-builtins.cc (build_frontend_type): Update for new front-end
	interface.
	(matches_builtin_type): Likewise.
	* d-codegen.cc (identity_compare_p): Likewise.
	(call_side_effect_free_p): Likewise.
	* d-convert.cc (convert_expr): Likewise.
	(check_valist_conversion): Likewise.
	* d-lang.cc (d_types_compatible_p): Likewise.
	* d-target.cc (Target::isVectorTypeSupported): Likewise.
	(Target::isReturnOnStack): Likewise.
	(Target::preferPassByRef): Likewise.
	* decl.cc (class DeclVisitor): Likewise.
	* expr.cc (class ExprVisitor): Likewise.
	* typeinfo.cc (class TypeInfoVisitor): Likewise.
	* types.cc (class TypeVisitor): Likewise.

libphobos/ChangeLog:

	* libdruntime/MERGE: Merge upstream druntime 66b93fc24a.
	* src/MERGE: Merge upstream phobos 0c28620c3.
	* src/Makefile.am (PHOBOS_DSOURCES): Add
	std/internal/test/sumtype_example_overloads.d.
	* src/Makefile.in: Regenerate.
2025-01-05 14:40:13 +01:00

164 lines
3.1 KiB
D

/**
* D binding to C++ <memory>.
*
* Copyright: Copyright (c) 2019 D Language Foundation
* License: Distributed under the
* $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0).
* (See accompanying file LICENSE)
* Authors: Manu Evans
* Source: $(DRUNTIMESRC core/stdcpp/memory.d)
*/
module core.stdcpp.memory;
public import core.stdcpp.allocator;
import core.stdcpp.xutility : StdNamespace;
extern(C++, (StdNamespace)):
///
unique_ptr!T make_unique(T, Args...)(auto ref Args args)
{
import core.lifetime : forward;
import core.stdcpp.new_ : cpp_new;
return unique_ptr!T(cpp_new!T(forward!args));
}
///
struct default_delete(T)
{
///
alias pointer = ClassOrPtr!T;
///
void opCall()(pointer ptr) const
{
import core.stdcpp.new_ : cpp_delete;
cpp_delete(ptr);
}
}
///
extern(C++, class)
struct unique_ptr(T, Deleter = default_delete!T)
{
extern(D):
///
this(this) @disable;
///
~this()
{
reset();
}
///
ref unique_ptr opAssign(typeof(null))
{
reset();
return this;
}
///
void reset(pointer p = null)
{
pointer t = __ptr();
__ptr() = p;
if (t)
get_deleter()(t);
}
nothrow pure @safe @nogc:
///
alias pointer = ClassOrPtr!T;
///
alias element_type = T;
///
alias deleter_type = Deleter;
///
this(pointer ptr)
{
__ptr() = ptr;
}
///
inout(pointer) get() inout nothrow
{
return __ptr();
}
///
bool opCast(T : bool)() const nothrow
{
return __ptr() != null;
}
///
pointer release() nothrow
{
pointer t = __ptr();
__ptr() = null;
return t;
}
// void swap(ref unique_ptr u) nothrow
// {
// __ptr_.swap(__u.__ptr_);
// }
version (CppRuntime_Microsoft)
{
///
ref inout(deleter_type) get_deleter() inout nothrow { return _Mypair._Myval1; }
private:
import core.stdcpp.xutility : _Compressed_pair;
ref pointer __ptr() nothrow { return _Mypair._Myval2; }
inout(pointer) __ptr() inout nothrow { return _Mypair._Myval2; }
_Compressed_pair!(Deleter, pointer) _Mypair;
}
else version (CppRuntime_GNU)
{
///
ref inout(deleter_type) get_deleter() inout nothrow { return _M_t.get!1; }
private:
import core.stdcpp.tuple : tuple, get;
ref pointer __ptr() nothrow { return _M_t.get!0; }
inout(pointer) __ptr() inout nothrow { return _M_t.get!0; }
tuple!(pointer, Deleter) _M_t;
}
else version (CppRuntime_LLVM)
{
///
ref inout(deleter_type) get_deleter() inout nothrow { return __ptr_.second; }
private:
import core.stdcpp.xutility : __compressed_pair;
ref pointer __ptr() nothrow { return __ptr_.first; }
inout(pointer) __ptr() inout nothrow { return __ptr_.first; }
__compressed_pair!(pointer, deleter_type) __ptr_;
}
}
private:
template ClassOrPtr(T)
{
static if (is(T == class))
alias ClassOrPtr = T;
else
alias ClassOrPtr = T*;
}