View source code
Display the source code in std/experimental/typecons.d from which this page was generated on github.
Report a bug
If you spot a problem with this page, click here to create a Bugzilla issue.
Improve this page
Quickly fork, edit online, and submit a pull request for this page. Requires a signed-in GitHub account. This works well for small changes. If you'd like to make larger changes you may want to consider using local clone.

std.experimental.typecons.unwrap - multiple declarations

Function unwrap

Extract object previously wrapped by wrap.

inout(Target) unwrap(Target, Source) (
  inout Source src
);

Parameters

NameDescription
Target type of wrapped object
src wrapper object returned by wrap

Returns

the wrapped object, or null if src is not a wrapper created by wrap and Target is a class

Throws

ConvException when attempting to extract a struct which is not the wrapped type

See also

wrap

Function unwrap

Extract object previously wrapped by wrap.

inout(Target) unwrap(Target, Source) (
  inout Source src
);

Parameters

NameDescription
Target type of wrapped object
src wrapper object returned by wrap

Returns

the wrapped object, or null if src is not a wrapper created by wrap and Target is a class

Throws

ConvException when attempting to extract a struct which is not the wrapped type

See also

wrap

Example

interface Quack
{
    int quack();
    @property int height();
}
interface Flyer
{
    @property int height();
}
class Duck : Quack
{
    int quack() { return 1; }
    @property int height() { return 10; }
}
class Human
{
    int quack() { return 2; }
    @property int height() { return 20; }
}
struct HumanStructure
{
    int quack() { return 3; }
    @property int height() { return 30; }
}

Duck d1 = new Duck();
Human h1 = new Human();
HumanStructure hs1;

interface Refreshable
{
    int refresh();
}
// does not have structural conformance
static assert(!__traits(compiles, d1.wrap!Refreshable));
static assert(!__traits(compiles, h1.wrap!Refreshable));
static assert(!__traits(compiles, hs1.wrap!Refreshable));

// strict upcast
Quack qd = d1.wrap!Quack;
assert(qd is d1);
assert(qd.quack() == 1);    // calls Duck.quack
// strict downcast
Duck d2 = qd.unwrap!Duck;
assert(d2 is d1);

// structural upcast
Quack qh = h1.wrap!Quack;
Quack qhs = hs1.wrap!Quack;
assert(qh.quack() == 2);    // calls Human.quack
assert(qhs.quack() == 3);    // calls HumanStructure.quack
// structural downcast
Human h2 = qh.unwrap!Human;
HumanStructure hs2 = qhs.unwrap!HumanStructure;
assert(h2 is h1);
assert(hs2 is hs1);

// structural upcast (two steps)
Quack qx = h1.wrap!Quack;   // Human -> Quack
Quack qxs = hs1.wrap!Quack;   // HumanStructure -> Quack
Flyer fx = qx.wrap!Flyer;   // Quack -> Flyer
Flyer fxs = qxs.wrap!Flyer;   // Quack -> Flyer
assert(fx.height == 20);    // calls Human.height
assert(fxs.height == 30);    // calls HumanStructure.height
// strucural downcast (two steps)
Quack qy = fx.unwrap!Quack; // Flyer -> Quack
Quack qys = fxs.unwrap!Quack; // Flyer -> Quack
Human hy = qy.unwrap!Human; // Quack -> Human
HumanStructure hys = qys.unwrap!HumanStructure; // Quack -> HumanStructure
assert(hy is h1);
assert(hys is hs1);
// strucural downcast (one step)
Human hz = fx.unwrap!Human; // Flyer -> Human
HumanStructure hzs = fxs.unwrap!HumanStructure; // Flyer -> HumanStructure
assert(hz is h1);
assert(hzs is hs1);

Example

import std.traits : functionAttributes, FunctionAttribute;
interface A { int run(); }
interface B { int stop(); @property int status(); }
class X
{
    int run() { return 1; }
    int stop() { return 2; }
    @property int status() { return 3; }
}

auto x = new X();
auto ab = x.wrap!(A, B);
A a = ab;
B b = ab;
writeln(a.run()); // 1
writeln(b.stop()); // 2
writeln(b.status); // 3
static assert(functionAttributes!(typeof(ab).status) & FunctionAttribute.property);

Authors

Andrei Alexandrescu, Bartosz Milewski, Don Clugston, Shin Fujishiro, Kenji Hara

License

Boost License 1.0.