Topic: Proposal: Generic RAII library...
Author: Arthur Tchaikovsky <atch.cpp@gmail.com>
Date: Mon, 12 Nov 2012 23:28:24 -0800 (PST)
Raw View
------=_Part_448_7234689.1352791704971
Content-Type: text/plain; charset=ISO-8859-1
>
> I personally would find it far more tedious to write little lambdas and
> such in every place I use a resource just to prevent resource leaks, when
> writing a single object once would solve the problem everywhere.
>
I couldn't agree more with that. I personally believe that lambdas are
worse for this kind of programming, i.e. they don't make code more
readable. High abstraction is better than low abstraction, so how is this:
RAIIExitScope SomeNameIDontWantToConflictWithAnything([&] {fclose(pFile);})
//Note the lambda
more readable/maintanable to this:
RAIIExitScope
SomeNameIDontWantToConflictWithAnything(safe_delete);//functor instead of
lambda
How can someone think that exposing guts (as lambdas do) is better than
hiding them behind an abstraction level (as functors do)? This is simply
not so.
On Wednesday, 7 November 2012 18:38:57 UTC, Nicol Bolas wrote:
>
>
>
> On Wednesday, November 7, 2012 8:25:53 AM UTC-8, Nevin ":-)" Liber wrote:
>>
>> Do you believe the status quo is good? Because if we do nothing, that is
>> where we will stay.
>>
>
> The status quo really depends on the programmers around you. If they're
> properly trained in the ways of RAII, then there's no problem with the
> status quo. They'll create RAII types that are moveable and everyone will
> be happy.
>
> If they're bad, C-in-C++ style programmers, then the status quo is that
> they'll continue to write C-in-C++ style programs. You can either break
> them of this habit, or add language features and library routines that *
> indulge* their hang-ups and idioms.
>
> Personally, I prefer the former. A clean break with their bad style of
> coding makes them more likely to pick up good idioms. Indulging their
> predilections reinforces the idea that they're right to do C-in-C++ coding.
>
>
>> Writing objects in C++ is incredibly tedious. I'd like to reduce that
>> tedium; otherwise, for "small" things, people just fall back on abusing
>> native types and writing C style code.
>>
>
> *Which* people? Your coworkers, perhaps. Other people, perhaps. But there
> are many C++ programmers who embraced RAII *long ago*, regardless of how
> "incredibly tedious" it was. C-in-C++ style is *not* the only style of
> C++ you'll find; there are many C++-style programmers running around.
>
> I personally would find it far more tedious to write little lambdas and
> such in every place I use a resource just to prevent resource leaks, when
> writing a single object *once* would solve the problem everywhere.
>
>
>> --
>> Nevin ":-)" Liber <mailto:ne...@eviloverlord.com> (847) 691-1404
>>
>
--
------=_Part_448_7234689.1352791704971
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;bor=
der-left: 1px #ccc solid;padding-left: 1ex;">I personally would find it far=
more tedious to write little lambdas and such in every place I use a resou=
rce just to prevent resource leaks, when writing a single object once would=
solve the problem everywhere.<br></blockquote><div><br></div><div>I couldn=
't agree more with that. I personally believe that lambdas are worse for th=
is kind of programming, i.e. they don't make code more readable. High abstr=
action is better than low abstraction, so how is this:<br></div><div><br>RA=
IIExitScope SomeNameIDontWantToConflictWithAnything([&] {fclose(pFile);=
}) //Note the lambda</div><div><br></div><div>more readable/maintanable to =
this:</div><div><br>RAIIExitScope SomeNameIDontWantToConflictWithAnything(s=
afe_delete);//functor instead of lambda</div><div><br></div><div>How can so=
meone think that exposing guts (as lambdas do) is better than hiding them b=
ehind an abstraction level (as functors do)? This is simply not so.</div><d=
iv><br></div><div><br></div><div><br></div>On Wednesday, 7 November 2012 18=
:38:57 UTC, Nicol Bolas wrote:<blockquote class=3D"gmail_quote" style=3D"m=
argin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"=
><br><br>On Wednesday, November 7, 2012 8:25:53 AM UTC-8, Nevin ":-)" Liber=
wrote:<blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8e=
x;border-left:1px #ccc solid;padding-left:1ex"><div class=3D"gmail_quote"><=
div>Do you believe the status quo is good? Because if we do nothing, =
that is where we will stay.<br></div></div></blockquote><div><br>The status=
quo really depends on the programmers around you. If they're properly trai=
ned in the ways of RAII, then there's no problem with the status quo. They'=
ll create RAII types that are moveable and everyone will be happy.<br><br>I=
f they're bad, C-in-C++ style programmers, then the status quo is that they=
'll continue to write C-in-C++ style programs. You can either break them of=
this habit, or add language features and library routines that <i>indulge<=
/i> their hang-ups and idioms.<br><br>Personally, I prefer the former. A cl=
ean break with their bad style of coding makes them more likely to pick up =
good idioms. Indulging their predilections reinforces the idea that they're=
right to do C-in-C++ coding.<br> </div><blockquote class=3D"gmail_quo=
te" style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-=
left:1ex"><div class=3D"gmail_quote"><div>
Writing objects in C++ is incredibly tedious. I'd like to reduce that tediu=
m; otherwise, for "small" things, people just fall back on abusing native t=
ypes and writing C style code.<br></div></div></blockquote><div><br><i>Whic=
h</i> people? Your coworkers, perhaps. Other people, perhaps. But there are=
many C++ programmers who embraced RAII <i>long ago</i>, regardless of how =
"incredibly tedious" it was. C-in-C++ style is <i>not</i> the only style of=
C++ you'll find; there are many C++-style programmers running around.<br><=
br>I personally would find it far more tedious to write little lambdas and =
such in every place I use a resource just to prevent resource leaks, when w=
riting a single object <i>once</i> would solve the problem everywhere.<br>&=
nbsp;</div><blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:=
0.8ex;border-left:1px #ccc solid;padding-left:1ex">-- <br>
Nevin ":-)" Liber <mailto:<a>ne...@eviloverlord.com</a>>&=
nbsp; (847) 691-1404<br>
</blockquote></blockquote>
<p></p>
-- <br />
<br />
<br />
<br />
------=_Part_448_7234689.1352791704971--
.
Author: Andrew Sandoval <sandoval@netwaysglobal.com>
Date: Mon, 12 Nov 2012 23:34:42 -0800 (PST)
Raw View
------=_Part_1209_2475289.1352792082575
Content-Type: text/plain; charset=ISO-8859-1
On Tuesday, November 13, 2012 1:28:25 AM UTC-6, Arthur Tchaikovsky wrote:
>
> I personally would find it far more tedious to write little lambdas and
>> such in every place I use a resource just to prevent resource leaks, when
>> writing a single object once would solve the problem everywhere.
>>
>
> I couldn't agree more with that. I personally believe that lambdas are
> worse for this kind of programming, i.e. they don't make code more
> readable. High abstraction is better than low abstraction, so how is this:
>
> RAIIExitScope SomeNameIDontWantToConflictWithAnything([&]
> {fclose(pFile);}) //Note the lambda
>
> more readable/maintanable to this:
>
> RAIIExitScope
> SomeNameIDontWantToConflictWithAnything(safe_delete);//functor instead of
> lambda
>
> How can someone think that exposing guts (as lambdas do) is better than
> hiding them behind an abstraction level (as functors do)? This is simply
> not so.
>
>
In general I agree. There are times however where a lambda is a perfect
fit. Very shortly I will post a (very rough) draft of the proposal and a
reference implementation. Please look through that and see the
possibilities that the library provides. The test cases that I've written
are not complete, and not meant to be real-world examples -- some are quite
contrived, but they still give a general idea on how the library can be
used.
Thanks,
Andrew Sandoval
--
------=_Part_1209_2475289.1352792082575
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
On Tuesday, November 13, 2012 1:28:25 AM UTC-6, Arthur Tchaikovsky wrote:<b=
lockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;borde=
r-left: 1px #ccc solid;padding-left: 1ex;"><blockquote class=3D"gmail_quote=
" style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-le=
ft:1ex">I personally would find it far more tedious to write little lambdas=
and such in every place I use a resource just to prevent resource leaks, w=
hen writing a single object once would solve the problem everywhere.<br></b=
lockquote><div><br></div><div>I couldn't agree more with that. I personally=
believe that lambdas are worse for this kind of programming, i.e. they don=
't make code more readable. High abstraction is better than low abstraction=
, so how is this:<br></div><div><br>RAIIExitScope SomeNameIDontWantToConfli=
ctWit<wbr>hAnything([&] {fclose(pFile);}) //Note the lambda</div><div><=
br></div><div>more readable/maintanable to this:</div><div><br>RAIIExitScop=
e SomeNameIDontWantToConflictWit<wbr>hAnything(safe_delete);//<wbr>functor =
instead of lambda</div><div><br></div><div>How can someone think that expos=
ing guts (as lambdas do) is better than hiding them behind an abstraction l=
evel (as functors do)? This is simply not so.</div><div><br></div></blockqu=
ote><div><br>In general I agree. There are times however where a lamb=
da is a perfect fit. Very shortly I will post a (very rough) draft of=
the proposal and a reference implementation. Please look through tha=
t and see the possibilities that the library provides. The test cases=
that I've written are not complete, and not meant to be real-world example=
s -- some are quite contrived, but they still give a general idea on how th=
e library can be used.<br><br>Thanks,<br>Andrew Sandoval <br></div>
<p></p>
-- <br />
<br />
<br />
<br />
------=_Part_1209_2475289.1352792082575--
.
Author: Andrew Sandoval <sandoval@netwaysglobal.com>
Date: Mon, 12 Nov 2012 23:48:49 -0800 (PST)
Raw View
------=_Part_466_7078637.1352792929495
Content-Type: text/plain; charset=ISO-8859-1
For those willing to take a look at the proposal as a very rough draft, it
can be found here: http://www.andrewlsandoval.com/scope_exit/
The Technical Specification section is completely blank. Judging by the
examples (and by my understanding of them) this portion will probably take
me several days. Of course, I'm grateful for any help, from anyone else
that would like to see this functionality added to the Standard Library.
And similarly for any feedback on the document as it currently stands.
This is my first shot at this kind of thing! So be gentle please! ;)
I'm also open to suggestions on the reference implementation<http://www.andrewlsandoval.com/scope_exit/scope_exit.h>.
I'm still adapting to the style difference, and like many, I'm not always
certain yet that I get all of my universal and rvalue references right.
(Possibly other things as well.)
Thanks in advance,
Andrew Sandoval
On Tuesday, November 13, 2012 1:34:42 AM UTC-6, Andrew Sandoval wrote:
>
> On Tuesday, November 13, 2012 1:28:25 AM UTC-6, Arthur Tchaikovsky wrote:
>>
>> I personally would find it far more tedious to write little lambdas and
>>> such in every place I use a resource just to prevent resource leaks, when
>>> writing a single object once would solve the problem everywhere.
>>>
>>
>> I couldn't agree more with that. I personally believe that lambdas are
>> worse for this kind of programming, i.e. they don't make code more
>> readable. High abstraction is better than low abstraction, so how is this:
>>
>> RAIIExitScope SomeNameIDontWantToConflictWithAnything([&]
>> {fclose(pFile);}) //Note the lambda
>>
>> more readable/maintanable to this:
>>
>> RAIIExitScope
>> SomeNameIDontWantToConflictWithAnything(safe_delete);//functor instead of
>> lambda
>>
>> How can someone think that exposing guts (as lambdas do) is better than
>> hiding them behind an abstraction level (as functors do)? This is simply
>> not so.
>>
>>
> In general I agree. There are times however where a lambda is a perfect
> fit. Very shortly I will post a (very rough) draft of the proposal and a
> reference implementation. Please look through that and see the
> possibilities that the library provides. The test cases that I've written
> are not complete, and not meant to be real-world examples -- some are quite
> contrived, but they still give a general idea on how the library can be
> used.
>
> Thanks,
> Andrew Sandoval
>
--
------=_Part_466_7078637.1352792929495
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
For those willing to take a look at the proposal as a very rough draft, it =
can be found here: <a href=3D"http://www.andrewlsandoval.com/scope_exit/">h=
ttp://www.andrewlsandoval.com/scope_exit/</a><br><br>The Technical Specific=
ation section is completely blank. Judging by the examples (and by my=
understanding of them) this portion will probably take me several days.&nb=
sp; Of course, I'm grateful for any help, from anyone else that would like =
to see this functionality added to the Standard Library. And similarl=
y for any feedback on the document as it currently stands. This is my=
first shot at this kind of thing! So be gentle please! ;)<br><br>I'm=
also open to suggestions on the reference <a href=3D"http://www.andrewlsan=
doval.com/scope_exit/scope_exit.h">implementation</a>. I'm still adap=
ting to the style difference, and like many, I'm not always certain yet tha=
t I get all of my universal and rvalue references right. (Possibly ot=
her things as well.)<br><br>Thanks in advance,<br>Andrew Sandoval<br><br>On=
Tuesday, November 13, 2012 1:34:42 AM UTC-6, Andrew Sandoval wrote:<blockq=
uote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-lef=
t: 1px #ccc solid;padding-left: 1ex;">On Tuesday, November 13, 2012 1:28:25=
AM UTC-6, Arthur Tchaikovsky wrote:<blockquote class=3D"gmail_quote" style=
=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-left:1ex"=
><blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;bord=
er-left:1px #ccc solid;padding-left:1ex">I personally would find it far mor=
e tedious to write little lambdas and such in every place I use a resource =
just to prevent resource leaks, when writing a single object once would sol=
ve the problem everywhere.<br></blockquote><div><br></div><div>I couldn't a=
gree more with that. I personally believe that lambdas are worse for this k=
ind of programming, i.e. they don't make code more readable. High abstracti=
on is better than low abstraction, so how is this:<br></div><div><br>RAIIEx=
itScope SomeNameIDontWantToConflictWit<wbr>hAnything([&] {fclose(pFile)=
;}) //Note the lambda</div><div><br></div><div>more readable/maintanable to=
this:</div><div><br>RAIIExitScope SomeNameIDontWantToConflictWit<wbr>hAnyt=
hing(safe_delete);//<wbr>functor instead of lambda</div><div><br></div><div=
>How can someone think that exposing guts (as lambdas do) is better than hi=
ding them behind an abstraction level (as functors do)? This is simply not =
so.</div><div><br></div></blockquote><div><br>In general I agree. The=
re are times however where a lambda is a perfect fit. Very shortly I =
will post a (very rough) draft of the proposal and a reference implementati=
on. Please look through that and see the possibilities that the libra=
ry provides. The test cases that I've written are not complete, and n=
ot meant to be real-world examples -- some are quite contrived, but they st=
ill give a general idea on how the library can be used.<br><br>Thanks,<br>A=
ndrew Sandoval <br></div></blockquote>
<p></p>
-- <br />
<br />
<br />
<br />
------=_Part_466_7078637.1352792929495--
.
Author: Martinho Fernandes <martinho.fernandes@gmail.com>
Date: Tue, 13 Nov 2012 09:38:45 +0100
Raw View
--047d7b2e4406caadea04ce5c5917
Content-Type: text/plain; charset=ISO-8859-1
I don't think contrived non-real-world examples are convincing. Especially
the second example, the one of "loop advancement": isn't that what a for
loop is for? (and then I can't stop thinking about iterators and the
algorithms)
Martinho
On Tue, Nov 13, 2012 at 8:34 AM, Andrew Sandoval <sandoval@netwaysglobal.com
> wrote:
> On Tuesday, November 13, 2012 1:28:25 AM UTC-6, Arthur Tchaikovsky wrote:
>>
>> I personally would find it far more tedious to write little lambdas and
>>> such in every place I use a resource just to prevent resource leaks, when
>>> writing a single object once would solve the problem everywhere.
>>>
>>
>> I couldn't agree more with that. I personally believe that lambdas are
>> worse for this kind of programming, i.e. they don't make code more
>> readable. High abstraction is better than low abstraction, so how is this:
>>
>> RAIIExitScope SomeNameIDontWantToConflictWit**hAnything([&]
>> {fclose(pFile);}) //Note the lambda
>>
>> more readable/maintanable to this:
>>
>> RAIIExitScope SomeNameIDontWantToConflictWit**hAnything(safe_delete);//**functor
>> instead of lambda
>>
>> How can someone think that exposing guts (as lambdas do) is better than
>> hiding them behind an abstraction level (as functors do)? This is simply
>> not so.
>>
>>
> In general I agree. There are times however where a lambda is a perfect
> fit. Very shortly I will post a (very rough) draft of the proposal and a
> reference implementation. Please look through that and see the
> possibilities that the library provides. The test cases that I've written
> are not complete, and not meant to be real-world examples -- some are quite
> contrived, but they still give a general idea on how the library can be
> used.
>
> Thanks,
> Andrew Sandoval
>
> --
>
>
>
>
--
--047d7b2e4406caadea04ce5c5917
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
I don't think contrived non-real-world examples are convincing. Especia=
lly the second example, the one of "loop advancement": isn't =
that what a for loop is for? (and then I can't stop thinking about iter=
ators and the algorithms)<br>
<br clear=3D"all">Martinho<br>
<br><br><div class=3D"gmail_quote">On Tue, Nov 13, 2012 at 8:34 AM, Andrew =
Sandoval <span dir=3D"ltr"><<a href=3D"mailto:sandoval@netwaysglobal.com=
" target=3D"_blank">sandoval@netwaysglobal.com</a>></span> wrote:<br><bl=
ockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #=
ccc solid;padding-left:1ex">
<div class=3D"im">On Tuesday, November 13, 2012 1:28:25 AM UTC-6, Arthur Tc=
haikovsky wrote:<blockquote class=3D"gmail_quote" style=3D"margin:0;margin-=
left:0.8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class=
=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc s=
olid;padding-left:1ex">
I personally would find it far more tedious to write little lambdas and suc=
h in every place I use a resource just to prevent resource leaks, when writ=
ing a single object once would solve the problem everywhere.<br></blockquot=
e>
<div><br></div><div>I couldn't agree more with that. I personally belie=
ve that lambdas are worse for this kind of programming, i.e. they don't=
make code more readable. High abstraction is better than low abstraction, =
so how is this:<br>
</div><div><br>RAIIExitScope SomeNameIDontWantToConflictWit<u></u>hAnything=
([&] {fclose(pFile);}) //Note the lambda</div><div><br></div><div>more =
readable/maintanable to this:</div><div><br>RAIIExitScope SomeNameIDontWant=
ToConflictWit<u></u>hAnything(safe_delete);//<u></u>functor instead of lamb=
da</div>
<div><br></div><div>How can someone think that exposing guts (as lambdas do=
) is better than hiding them behind an abstraction level (as functors do)? =
This is simply not so.</div><div><br></div></blockquote></div><div><br>
In general I agree.=A0 There are times however where a lambda is a perfect =
fit.=A0 Very shortly I will post a (very rough) draft of the proposal and a=
reference implementation.=A0 Please look through that and see the possibil=
ities that the library provides.=A0 The test cases that I've written ar=
e not complete, and not meant to be real-world examples -- some are quite c=
ontrived, but they still give a general idea on how the library can be used=
..<br>
<br>Thanks,<br>Andrew Sandoval <br></div><span class=3D"HOEnZb"><font color=
=3D"#888888">
<p></p>
-- <br>
=A0<br>
=A0<br>
=A0<br>
</font></span></blockquote></div><br>
<p></p>
-- <br />
<br />
<br />
<br />
--047d7b2e4406caadea04ce5c5917--
.
Author: Ville Voutilainen <ville.voutilainen@gmail.com>
Date: Tue, 13 Nov 2012 11:20:44 +0200
Raw View
On 13 November 2012 09:48, Andrew Sandoval <sandoval@netwaysglobal.com> wrote:
> For those willing to take a look at the proposal as a very rough draft, it
> can be found here: http://www.andrewlsandoval.com/scope_exit/
> The Technical Specification section is completely blank. Judging by the
> examples (and by my understanding of them) this portion will probably take
> me several days. Of course, I'm grateful for any help, from anyone else
> that would like to see this functionality added to the Standard Library.
> And similarly for any feedback on the document as it currently stands. This
> is my first shot at this kind of thing! So be gentle please! ;)
> I'm also open to suggestions on the reference implementation. I'm still
> adapting to the style difference, and like many, I'm not always certain yet
> that I get all of my universal and rvalue references right. (Possibly other
> things as well.)
Some thoughts:
About the motivation and unique_ptr, I don't have to dereference a value from
..get(), I can just use operator* when I need a reference to the
underlying value.
If I need the pointer, I need .get(), sure. It's understandable that
these wrappers
have a cast operator, since they aren't similar to smart pointers in
that sense and
there's no danger in getting the underlying object.
Should scoped_resource throw from its constructor if it gets a no-delete value?
Should we have operator-> for accessing the underlying value?
The _uc and _t suffixes are unfortunately unclear. I'm not going to
start a bikeshedding
right now, but I think the names need to be reconsidered.
Should these handles have make_ function counterparts? That would probably
alleviate the need for the SCOPED_DELETER macro.
--
.
Author: Andrew Sandoval <sandoval@netwaysglobal.com>
Date: Tue, 13 Nov 2012 08:09:15 -0800 (PST)
Raw View
------=_Part_1748_31940142.1352822955147
Content-Type: text/plain; charset=ISO-8859-1
On Tuesday, November 13, 2012 2:39:06 AM UTC-6, R. Martinho Fernandes wrote:
>
> I don't think contrived non-real-world examples are convincing. Especially
> the second example, the one of "loop advancement": isn't that what a for
> loop is for? (and then I can't stop thinking about iterators and the
> algorithms)
>
> Martinho
>
>
> I am open to suggestions. I would be surprised to find out that other
long time C++ programmers haven't seen similar problems with loop
advancement -- because someone comes in a year after a product is shipping
and while attempting to fix a bug adds a conditional continue to a loop
which results in skipping over the loop advancement, producing a tight loop
when that condition is hit. Sure, it can be avoided by code reviews and
greater care, but by using RAII you have the ability to code a bit more
defensively.
I can't speak for everyone else out there -- my experience comes from real
world commercial programming. And I have to tell you that I would love it
if everyone used algorithms like std::for_each instead old C style loops,
but they don't and in many cases there is good justification for it. C++
is strengthened if we add library components that help programmers to write
code that begins with the end in mind. That is what an RAII object for
loop advancement does.
Thanks,
Andrew Sandoval
--
------=_Part_1748_31940142.1352822955147
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
On Tuesday, November 13, 2012 2:39:06 AM UTC-6, R. Martinho Fernandes wrote=
:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;bo=
rder-left: 1px #ccc solid;padding-left: 1ex;">I don't think contrived non-r=
eal-world examples are convincing. Especially the second example, the one o=
f "loop advancement": isn't that what a for loop is for? (and then I can't =
stop thinking about iterators and the algorithms)<br>
<br clear=3D"all">Martinho<br>
<br><br></blockquote><div>I am open to suggestions. I would be surpri=
sed to find out that other long time C++ programmers haven't seen similar p=
roblems with loop advancement -- because someone comes in a year after a pr=
oduct is shipping and while attempting to fix a bug adds a conditional <spa=
n style=3D"font-family: courier new,monospace;">continue </span>to a loop w=
hich results in skipping over the loop advancement, producing a tight loop =
when that condition is hit. Sure, it can be avoided by code reviews a=
nd greater care, but by using RAII you have the ability to code a bit more =
defensively.<br><br>I can't speak for everyone else out there -- my experie=
nce comes from real world commercial programming. And I have to tell =
you that I would love it if everyone used algorithms like <span style=3D"fo=
nt-family: courier new,monospace;">std::for_each</span> instead old C style=
loops, but they don't and in many cases there is good justification for it=
.. C++ is strengthened if we add library components that help programm=
ers to write code that begins with the end in mind. That is what an R=
AII object for loop advancement does.<br><br>Thanks,<br>Andrew Sandoval<br>=
</div>
<p></p>
-- <br />
<br />
<br />
<br />
------=_Part_1748_31940142.1352822955147--
.
Author: Martinho Fernandes <martinho.fernandes@gmail.com>
Date: Tue, 13 Nov 2012 17:23:21 +0100
Raw View
--f46d042dffd167713004ce62d73f
Content-Type: text/plain; charset=ISO-8859-1
On Tue, Nov 13, 2012 at 5:09 PM, Andrew Sandoval <sandoval@netwaysglobal.com
> wrote:
> I am open to suggestions.
I don't have any examples, because I am with Nicol on this: I don't think
this is necessary. I wrote a similar scope guard thing before, and sometime
later I realised that it was only used it in its own tests.
> I would be surprised to find out that other long time C++ programmers
> haven't seen similar problems with loop advancement -- because someone
> comes in a year after a product is shipping and while attempting to fix a
> bug adds a conditional continue to a loop which results in skipping over
> the loop advancement, producing a tight loop when that condition is hit.
> Sure, it can be avoided by code reviews and greater care, but by using RAII
> you have the ability to code a bit more defensively.
>
But there's a much simpler fix than adding whatever RAII object without an
actual resource whose sole purpose is to run something at the end of each
iteration: a for loop. Either that, or honestly I don't understand what
these problems with loop advancement are.
My overall point is that if you really want this to fly, you need to
provide convincing examples. Preferably examples that relate to real-world
code somehow. You can't expect people to relate to this feature if there
are no convincing use cases. You need to provide examples where this
feature is superior to the alternatives, or where there are no reasonable
alternatives at all. Those examples need to be code that someone would
actually see themselves needing to write.
Martinho.
--
--f46d042dffd167713004ce62d73f
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
<br><div class=3D"gmail_quote">On Tue, Nov 13, 2012 at 5:09 PM, Andrew Sand=
oval <span dir=3D"ltr"><<a href=3D"mailto:sandoval@netwaysglobal.com" ta=
rget=3D"_blank">sandoval@netwaysglobal.com</a>></span> wrote:<br><blockq=
uote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc =
solid;padding-left:1ex">
I am open to suggestions.</blockquote><div><br>I don't have any example=
s, because I am with Nicol on this: I don't think this is necessary. I =
wrote a similar scope guard thing before, and sometime later I realised tha=
t it was only used it in its own tests.<br>
=A0</div><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;borde=
r-left:1px #ccc solid;padding-left:1ex">I would be surprised to find out th=
at other long time C++ programmers haven't seen similar problems with l=
oop advancement -- because someone comes in a year after a product is shipp=
ing and while attempting to fix a bug adds a conditional <span style=3D"fon=
t-family:courier new,monospace">continue </span>to a loop which results in =
skipping over the loop advancement, producing a tight loop when that condit=
ion is hit.=A0 Sure, it can be avoided by code reviews and greater care, bu=
t by using RAII you have the ability to code a bit more defensively.<br>
<div></div></blockquote><div><br>But there's a much simpler fix than ad=
ding whatever RAII object without an actual resource whose sole purpose is =
to run something at the end of each iteration: a for loop. Either that, or =
honestly I don't understand what these problems with loop advancement a=
re.<br>
<br>My overall point is that if you really want this to fly, you need to pr=
ovide
convincing examples. Preferably examples that relate to real-world code
somehow. You can't expect people to relate to this feature if there ar=
e no convincing use cases. You need to provide examples where this feature =
is superior to the alternatives, or where there are no reasonable alternati=
ves at all. Those examples need to be code that someone would actually see =
themselves needing to write.<br>
<br>Martinho. <br></div></div><br>
<p></p>
-- <br />
<br />
<br />
<br />
--f46d042dffd167713004ce62d73f--
.
Author: Andrew Sandoval <sandoval@netwaysglobal.com>
Date: Tue, 13 Nov 2012 08:37:24 -0800 (PST)
Raw View
------=_Part_352_21097694.1352824644406
Content-Type: text/plain; charset=ISO-8859-1
Answers are inline below. Thanks Ville!
On Tuesday, November 13, 2012 3:20:46 AM UTC-6, Ville Voutilainen wrote:
>
>
> Some thoughts:
>
> About the motivation and unique_ptr, I don't have to dereference a value
> from
> .get(), I can just use operator* when I need a reference to the
> underlying value.
> If I need the pointer, I need .get(), sure. It's understandable that
> these wrappers
> have a cast operator, since they aren't similar to smart pointers in
> that sense and
> there's no danger in getting the underlying object.
>
>
Good point. I've modified that paragraph. Hopefully it now makes it clear
why std::unique_ptr isn't the best fit.
Should scoped_resource throw from its constructor if it gets a no-delete
> value?
>
> No! The goal here is to replace code that does something like the
following at the bottom of every function (which often lead to goto being
used to exit on error):
ErrorExit:
if(resource != no_delete_value)
{
delete_resource(resource)
}
There may be arguments to be made for having a version of the classes that
does throw, *but having to catch exceptions would alter the scope and
therefore the expected lifetime of the resource*! IMO, using the .valid()member is far superior than throwing.
In my experience, every time an exception handler must be used, nesting and
complexity increase, and often unnecessarily.
Should we have operator-> for accessing the underlying value?
>
> I'm not opposed to that. I can add that if there is consensus. With the
get() method, and a cast operator it doesn't feel intuitive to useoperator->to me, but I could be convinced.
The _uc and _t suffixes are unfortunately unclear. I'm not going to
> start a bikeshedding
> right now, but I think the names need to be reconsidered.
>
> I struggled with the names, and I am definitely open to suggestions. I'm
not even certain that scoped_resource_uc should be kept. The uc was for
unchecked. Given that there is a function template to generate it I didn't
think the type name was too important. With the exception of
scoped_resource_t I don't see the typenames being used very often. Either
way, I am not in any way married to the names. If others can make
suggestions on this, consistent with the point to the class, I will gladly
work with them and create better names.
Remember that the most common expected use of scoped_function,scoped_resource_uc,
and scoped_resource is when it is built using scope_exit() with parameters
that create the appropriate type. So, the left-hand side will usually be
auto.
Because of the template arguments that is not true for scoped_resource_t.
I expect scoped_resource_t will also be the only one to be commonly found
in member variables.
> Should these handles have make_ function counterparts? That would probably
> alleviate the need for the SCOPED_DELETER macro.
>
The already do in the form of the scope_exit. I'd be happy to rename those
to make_scoped_function / make_scoped_resource, etc. Only scoped_resource_tdoes not, and that is because I can't see anyway to do it. It requires two
non-type template arguments. Also, I want it to be usable in class
members, and for that to work, the template arguments need to be present
rather than deduced by template function.
If the SCOPED_DELETER macro is going to be a hang up, I'll remove all
reference to it. I would rather write every example using <decltype(&deleter_func),
deleter_func> than to have the macro detract from the importance of
scoped_resource_t.
Thanks again,
Andrew Sandoval
--
------=_Part_352_21097694.1352824644406
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Answers are inline below. Thanks Ville!<br><br>On Tuesday, November 1=
3, 2012 3:20:46 AM UTC-6, Ville Voutilainen wrote:<blockquote class=3D"gmai=
l_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;=
padding-left: 1ex;"><br>Some thoughts:
<br>
<br>About the motivation and unique_ptr, I don't have to dereference a valu=
e from
<br>.get(), I can just use operator* when I need a reference to the
<br>underlying value.
<br>If I need the pointer, I need .get(), sure. It's understandable that
<br>these wrappers
<br>have a cast operator, since they aren't similar to smart pointers in
<br>that sense and
<br>there's no danger in getting the underlying object.
<br>
<br></blockquote><div><br>Good point. I've modified that paragraph.&n=
bsp; Hopefully it now makes it clear why <span style=3D"font-family: courie=
r new,monospace;">std::unique_ptr</span> isn't the best fit. <br><br></div>=
<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;bor=
der-left: 1px #ccc solid;padding-left: 1ex;">Should scoped_resource throw f=
rom its constructor if it gets a no-delete value?
<br>
<br></blockquote><div>No! The goal here is to replace code that does =
something like the following at the bottom of every function (which often l=
ead to <span style=3D"font-family: courier new,monospace;">goto </span>bein=
g used to exit on error):<br><br><span style=3D"font-family: courier new,mo=
nospace;">ErrorExit:<br> if(resource !=3D no_delete_value)<br>=
{<br> delete_resour=
ce(resource)<br> } </span><br><br>There may be arguments to be=
made for having a version of the classes that does <span style=3D"font-fam=
ily: courier new,monospace;">throw</span>, <u>but having to catch exception=
s would alter the scope and therefore the expected lifetime of the resource=
</u>! IMO, using the <span style=3D"font-family: courier new,monospac=
e;">.valid()</span> member is far superior than throwing.<br><br>In my expe=
rience, every time an exception handler must be used, nesting and complexit=
y increase, and often unnecessarily.<br><br></div><blockquote class=3D"gmai=
l_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;=
padding-left: 1ex;">Should we have operator-> for accessing the underlyi=
ng value?
<br>
<br></blockquote><div>I'm not opposed to that. I can add that if ther=
e is consensus. With the <span style=3D"font-family: courier new,mono=
space;">get()</span> method, and a cast operator it doesn't feel intuitive =
to use<span style=3D"font-family: courier new,monospace;"> operator-></s=
pan> to me, but I could be convinced.<br><br></div><blockquote class=3D"gma=
il_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid=
;padding-left: 1ex;">The _uc and _t suffixes are unfortunately unclear. I'm=
not going to
<br>start a bikeshedding
<br>right now, but I think the names need to be reconsidered.
<br>
<br></blockquote><div>I struggled with the names, and I am definitely open =
to suggestions. I'm not even certain that <span style=3D"font-family:=
courier new,monospace;">scoped_resource_uc</span> should be kept. Th=
e <span style=3D"font-family: courier new,monospace;">uc </span>was for unc=
hecked. Given that there is a function template to generate it I didn=
't think the type name was too important. With the exception of <span=
style=3D"font-family: courier new,monospace;">scoped_resource_t</span> I d=
on't see the typenames being used very often. Either way, I am not in=
any way married to the names. If others can make suggestions on this=
, consistent with the point to the class, I will gladly work with them and =
create better names.<br><br>Remember that the most common expected use of <=
span style=3D"font-family: courier new,monospace;">scoped_function</span>,<=
span style=3D"font-family: courier new,monospace;"> scoped_resource_uc</spa=
n>, and <span style=3D"font-family: courier new,monospace;">scoped_resource=
</span> is when it is built using <span style=3D"font-family: courier new,m=
onospace;">scope_exit()</span> with parameters that create the appropriate =
type. So, the left-hand side will usually be <span style=3D"font-fami=
ly: courier new,monospace;">auto</span>.<br><br>Because of the template arg=
uments that is not true for <span style=3D"font-family: courier new,monospa=
ce;">scoped_resource_t</span>. I expect <span style=3D"font-family: c=
ourier new,monospace;">scoped_resource_t</span> will also be the only one t=
o be commonly found in member variables.<br><br> <br></div><blockquote=
class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1=
px #ccc solid;padding-left: 1ex;">Should these handles have make_ function =
counterparts? That would probably
<br>alleviate the need for the SCOPED_DELETER macro.
<br></blockquote><div><br>The already do in the form of the <span style=3D"=
font-family: courier new,monospace;">scope_exit</span>. I'd be happy =
to rename those to <span style=3D"font-family: courier new,monospace;">make=
_scoped_function</span> / <span style=3D"font-family: courier new,monospace=
;">make_scoped_resource</span>, etc. Only <span style=3D"font-family:=
courier new,monospace;">scoped_resource_t</span> does not, and that is bec=
ause I can't see anyway to do it. It requires two non-type template a=
rguments. Also, I want it to be usable in class members, and for that=
to work, the template arguments need to be present rather than deduced by =
template function.<br><br>If the <span style=3D"font-family: courier new,mo=
nospace;">SCOPED_DELETER</span> macro is going to be a hang up, I'll remove=
all reference to it. I would rather write every example using <span =
style=3D"font-family: courier new,monospace;"><decltype(&deleter_fun=
c), deleter_func></span> than to have the macro detract from the importa=
nce of <span style=3D"font-family: courier new,monospace;">scoped_resource_=
t</span>.<br><br>Thanks again,<br>Andrew Sandoval<br><br><br><br></div>
<p></p>
-- <br />
<br />
<br />
<br />
------=_Part_352_21097694.1352824644406--
.
Author: Ville Voutilainen <ville.voutilainen@gmail.com>
Date: Tue, 13 Nov 2012 19:22:32 +0200
Raw View
On 13 November 2012 18:37, Andrew Sandoval <sandoval@netwaysglobal.com> wrote:
> Answers are inline below. Thanks Ville!
As they should be, top-posting is brain-damaged. :)
>> Should scoped_resource throw from its constructor if it gets a no-delete
>> value?
> No! The goal here is to replace code that does something like the following
> at the bottom of every function (which often lead to goto being used to exit
> on error):
> ErrorExit:
> if(resource != no_delete_value)
> {
> delete_resource(resource)
> }
> There may be arguments to be made for having a version of the classes that
> does throw, but having to catch exceptions would alter the scope and
> therefore the expected lifetime of the resource! IMO, using the .valid()
> member is far superior than throwing.
Lifetime of the resource? What resource? We just failed to acquire a resource.
Consider vector.
vector<int> f();
vector<int> x(f());
if the Acquisition of the Resource fails, Initialization fails as
well. Using open(),
if open() fails, we have no resource to operate on. Why are we
continuing forward
with the initialization, or the code beyond it? The response to an
initialization failure
in C++ is a throw. Now, for the handles that can't detect the failure,
we can't do that,
but for the handle that takes the "invalid" value as an argument, we
can, and likely
should.
> In my experience, every time an exception handler must be used, nesting and
> complexity increase, and often unnecessarily.
I have the completely opposite experience. I don't have to do nested checks
with exceptions, and the complexity of code is less than without exceptions.
I can decide where I put the complexity, and the no-error paths are fast and
clean because there's no checking of return values all over the place. That's
the reason people use RAII instead of return values or valid() checks.
>> Should we have operator-> for accessing the underlying value?
> I'm not opposed to that. I can add that if there is consensus. With the
> get() method, and a cast operator it doesn't feel intuitive to use
> operator-> to me, but I could be convinced.
When I use a handle, I want to use it for all accesses to the
underlying resource,
so if I have to call a member function of the underlying resource, I expect to
be able to do handle->func(), not handle.get().func() or, heaven forbid,
Resource& res = handle; res.func(); or Resource& res = handle.get(); res.func();
Handles are, as often as possible, as transparent as possible. That
would indicate
that we want to have, for the purposes of type-deducing function templates,
operator*(), and for things that want a pointer, operator&(), too.
--
.
Author: Andrew Sandoval <sandoval@netwaysglobal.com>
Date: Tue, 13 Nov 2012 09:26:18 -0800 (PST)
Raw View
------=_Part_412_23868679.1352827579001
Content-Type: text/plain; charset=ISO-8859-1
On Tuesday, November 13, 2012 10:23:44 AM UTC-6, R. Martinho Fernandes
wrote:
>
>
> On Tue, Nov 13, 2012 at 5:09 PM, Andrew Sandoval <
> sand...@netwaysglobal.com <javascript:>> wrote:
>
>> I am open to suggestions.
>
>
> I don't have any examples, because I am with Nicol on this: I don't think
> this is necessary. I wrote a similar scope guard thing before, and sometime
> later I realised that it was only used it in its own tests.
>
>
>> I would be surprised to find out that other long time C++ programmers
>> haven't seen similar problems with loop advancement -- because someone
>> comes in a year after a product is shipping and while attempting to fix a
>> bug adds a conditional continue to a loop which results in skipping over
>> the loop advancement, producing a tight loop when that condition is hit.
>> Sure, it can be avoided by code reviews and greater care, but by using RAII
>> you have the ability to code a bit more defensively.
>>
>
> But there's a much simpler fix than adding whatever RAII object without an
> actual resource whose sole purpose is to run something at the end of each
> iteration: a for loop. Either that, or honestly I don't understand what
> these problems with loop advancement are.
>
> My overall point is that if you really want this to fly, you need to
> provide convincing examples. Preferably examples that relate to real-world
> code somehow. You can't expect people to relate to this feature if there
> are no convincing use cases. You need to provide examples where this
> feature is superior to the alternatives, or where there are no reasonable
> alternatives at all. Those examples need to be code that someone would
> actually see themselves needing to write.
>
> Martinho.
>
> Martinho, I'm fairly certain no matter what examples I use I'm not going
to convince everyone. Somehow I'm fairly certain that my saying that I've
been using classes like these for the last 6 or 7 years, and teaching
others to use them instead of the completely unsafe methods that they
default to, and that it has dramatically improved the quality of several
products isn't going to convince you. I simple don't have the right or the
time to go and pull examples from these products and show the before and
after. It should be fairly obvious from the examples I've given, for any
experienced C++ programmer. If you and Nicol are on the committee and can
tell me that this isn't going to make it through, then please do so, and
I'll will place my efforts elsewhere. Otherwise, please use your
imagination and I am convinced you will see that this has every bit as much
value as does std::unique_ptr, std::shared_ptr, and many other classes
which are used to similar ends. It is a very pragmatic solution to a real
world problem.
My goal is to simplify what Nicol sees as the answer, and to simplify the
alternative at the same time. It is to improve overall code quality.
Everywhere I've worked I've found that most resources will be leaked on
unwind, and are often leaked simply because the author didn't think about
all of the exit paths that could lead to a leak. (I've also seen some
really nasty nesting to try to cover all exit paths and conditions.) These
types of things costs companies millions of dollars every day in lost
productivity. They are difficult problems to debug in complex code. Most
programmers don't have the skills necessary to discover that an exception
handler further down the stack unwound their code and leaked a resource,
like a lock for example, and then moved on and later hung or crashed,
etc.. By the time they get a crash dump from the field it takes a lot of
work to figure out what went wrong -- and most of them aren't even aware of
the potential for their resource to leak on unwind. And it's not like I am
an amateur that has only worked for one company with some not so great of
engineers. I've been writing C++ professionally since 1993, and tackling
problems most engineers consider too hard. I've seen this a lot. And no
matter how hard you try you are not going to get everyone to write
non-generic objects to wrap around every type of resource. After all, I've
recently worked at a place where some teams insisted on using straight-C
for various idiotic reasons. In one case my presentation on RAII, and an
earlier version of scoped_resource_t (named very differently) was the
closest thing there was to a convincing reason for that team to switch to
C++.
It is easy to say "this is not needed at all", but remember that there are
still people out there that think C++ isn't needed because they can always
write their code in assembly language. Guess what, I can too, but I don't
want to. I want to see the language improved to the point where it can win
back the dominant position and make languages like Java and C# return to
their status as being just a step above shell scripts and .bat files.
Where it is clear that you can get better quality, faster code from C++,
and you don't have to put a monumental effort into it to produce code that
does as much as few lines in one of those languages.
My understanding is that the point to this list, and to the proposals being
generated is to promote C++ and good programming practices. I believe that
this proposal goes along way toward that effort. Nevertheless, I'd much
prefer to not waste time trying to convince those who for whatever reason
aren't going to bend.
I'm very appreciative of the feedback from many others that have helped
move this along. I will try to find ways to make the examples more
convincing, and I appreciate your suggestion. Please however, if you are
on the committee and intend to shoot this down no matter what, please make
that clear. This is a very time consuming process, and I don't have any to
waste.
Thank you much,
Andrew Sandoval
--
------=_Part_412_23868679.1352827579001
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
On Tuesday, November 13, 2012 10:23:44 AM UTC-6, R. Martinho Fernandes wrot=
e:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;b=
order-left: 1px #ccc solid;padding-left: 1ex;"><br><div class=3D"gmail_quot=
e">On Tue, Nov 13, 2012 at 5:09 PM, Andrew Sandoval <span dir=3D"ltr"><<=
a href=3D"javascript:" target=3D"_blank" gdf-obfuscated-mailto=3D"fO3sxpK5I=
0YJ">sand...@netwaysglobal.com</a>></span> wrote:<br><blockquote class=
=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padd=
ing-left:1ex">
I am open to suggestions.</blockquote><div><br>I don't have any examples, b=
ecause I am with Nicol on this: I don't think this is necessary. I wrote a =
similar scope guard thing before, and sometime later I realised that it was=
only used it in its own tests.<br>
</div><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;bo=
rder-left:1px #ccc solid;padding-left:1ex">I would be surprised to find out=
that other long time C++ programmers haven't seen similar problems with lo=
op advancement -- because someone comes in a year after a product is shippi=
ng and while attempting to fix a bug adds a conditional <span style=3D"font=
-family:courier new,monospace">continue </span>to a loop which results in s=
kipping over the loop advancement, producing a tight loop when that conditi=
on is hit. Sure, it can be avoided by code reviews and greater care, =
but by using RAII you have the ability to code a bit more defensively.<br>
<div></div></blockquote><div><br>But there's a much simpler fix than adding=
whatever RAII object without an actual resource whose sole purpose is to r=
un something at the end of each iteration: a for loop. Either that, or hone=
stly I don't understand what these problems with loop advancement are.<br>
<br>My overall point is that if you really want this to fly, you need to pr=
ovide
convincing examples. Preferably examples that relate to real-world code
somehow. You can't expect people to relate to this feature if there are no=
convincing use cases. You need to provide examples where this feature is s=
uperior to the alternatives, or where there are no reasonable alternatives =
at all. Those examples need to be code that someone would actually see them=
selves needing to write.<br>
<br>Martinho. <br></div></div><br></blockquote><div>Martinho, I'm fairly ce=
rtain no matter what examples I use I'm not going to convince everyone.&nbs=
p; Somehow I'm fairly certain that my saying that I've been using classes l=
ike these for the last 6 or 7 years, and teaching others to use them instea=
d of the completely unsafe methods that they default to, and that it has dr=
amatically improved the quality of several products isn't going to convince=
you. I simple don't have the right or the time to go and pull exampl=
es from these products and show the before and after. It should be fa=
irly obvious from the examples I've given, for any experienced C++ programm=
er. If you and Nicol are on the committee and can tell me that this i=
sn't going to make it through, then please do so, and I'll will place my ef=
forts elsewhere. Otherwise, please use your imagination and I am conv=
inced you will see that this has every bit as much value as does <span styl=
e=3D"font-family: courier new,monospace;">std::unique_ptr</span>, <span sty=
le=3D"font-family: courier new,monospace;">std::shared_ptr</span>, and many=
other classes which are used to similar ends. It is a very pragmatic=
solution to a real world problem.<br><br>My goal is to simplify what Nicol=
sees as the answer, and to simplify the alternative at the same time. =
; It is to improve overall code quality. Everywhere I've worked I've =
found that most resources will be leaked on unwind, and are often leaked si=
mply because the author didn't think about all of the exit paths that could=
lead to a leak. (I've also seen some really nasty nesting to try to =
cover all exit paths and conditions.) These types of things costs com=
panies millions of dollars every day in lost productivity. They are d=
ifficult problems to debug in complex code. Most programmers don't ha=
ve the skills necessary to discover that an exception handler further down =
the stack unwound their code and leaked a resource, like a lock for example=
, and then moved on and later hung or crashed, etc.. By the time they=
get a crash dump from the field it takes a lot of work to figure out what =
went wrong -- and most of them aren't even aware of the potential for their=
resource to leak on unwind. And it's not like I am an amateur that h=
as only worked for one company with some not so great of engineers. I=
've been writing C++ professionally since 1993, and tackling problems most =
engineers consider too hard. I've seen this a lot. And no matte=
r how hard you try you are not going to get everyone to write non-generic o=
bjects to wrap around every type of resource. After all, I've recentl=
y worked at a place where some teams insisted on using straight-C for vario=
us idiotic reasons. In one case my presentation on RAII, and an earli=
er version of <span style=3D"font-family: courier new,monospace;">scoped_re=
source_t</span> (named very differently) was the closest thing there was to=
a convincing reason for that team to switch to C++.<br><br>It is easy to s=
ay "this is not needed at all", but remember that there are still people ou=
t there that think C++ isn't needed because they can always write their cod=
e in assembly language. Guess what, I can too, but I don't want to.&n=
bsp; I want to see the language improved to the point where it can win back=
the dominant position and make languages like Java and C# return to their =
status as being just a step above shell scripts and .bat files. Where=
it is clear that you can get better quality, faster code from C++, and you=
don't have to put a monumental effort into it to produce code that does as=
much as few lines in one of those languages.<br><br>My understanding is th=
at the point to this list, and to the proposals being generated is to promo=
te C++ and good programming practices. I believe that this proposal g=
oes along way toward that effort. Nevertheless, I'd much prefer to no=
t waste time trying to convince those who for whatever reason aren't going =
to bend.<br><br>I'm very appreciative of the feedback from many others that=
have helped move this along. I will try to find ways to make the exa=
mples more convincing, and I appreciate your suggestion. Please howev=
er, if you are on the committee and intend to shoot this down no matter wha=
t, please make that clear. This is a very time consuming process, and=
I don't have any to waste.<br><br>Thank you much,<br>Andrew Sandoval<br><b=
r></div>
<p></p>
-- <br />
<br />
<br />
<br />
------=_Part_412_23868679.1352827579001--
.
Author: Ville Voutilainen <ville.voutilainen@gmail.com>
Date: Tue, 13 Nov 2012 19:39:31 +0200
Raw View
On 13 November 2012 19:26, Andrew Sandoval <sandoval@netwaysglobal.com> wrote:
> and I appreciate your suggestion. Please however, if you are on the
> committee and intend to shoot this down no matter what, please make that
> clear. This is a very time consuming process, and I don't have any to
> waste.
I am in the committee, and I have no intention to shoot this down. I
use RAII in loop bodies,
and it's useful there. I don't use for-loops as a RAII replacement,
namely because it DOES
NOT WORK. :) If I throw an exception from the loop body, the for loop
will not save me,
but a RAII handle will. And if I'm using a RAII handle to cope with
exceptions, I am going
to use the same handle to cope with goto/break/continue/return, too.
--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Tue, 13 Nov 2012 09:47:07 -0800 (PST)
Raw View
------=_Part_733_28199234.1352828827580
Content-Type: text/plain; charset=ISO-8859-1
On Tuesday, November 13, 2012 9:39:33 AM UTC-8, Ville Voutilainen wrote:
>
> On 13 November 2012 19:26, Andrew Sandoval <sand...@netwaysglobal.com<javascript:>>
> wrote:
> > and I appreciate your suggestion. Please however, if you are on the
> > committee and intend to shoot this down no matter what, please make that
> > clear. This is a very time consuming process, and I don't have any to
> > waste.
>
> I am in the committee, and I have no intention to shoot this down. I
> use RAII in loop bodies,
> and it's useful there. I don't use for-loops as a RAII replacement,
> namely because it DOES
> NOT WORK. :) If I throw an exception from the loop body, the for loop
> will not save me,
> but a RAII handle will. And if I'm using a RAII handle to cope with
> exceptions, I am going
> to use the same handle to cope with goto/break/continue/return, too.
>
I'm pretty sure he's talking about using RAII as the thing that increments
the loop counter. Like this:
int *currValue = &someArray[0];
for(int i = 0; i < size; ++i)
{
scope(exit) {++currValue;} //Every iteration will update the current
value.
//...
if(soemthing)
{
continue;
}
//++currValue; //old way: skipped by the continue. By accident.
}
But obviously for more complex cases.
--
------=_Part_733_28199234.1352828827580
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
<br><br>On Tuesday, November 13, 2012 9:39:33 AM UTC-8, Ville Voutilainen w=
rote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8e=
x;border-left: 1px #ccc solid;padding-left: 1ex;">On 13 November 2012 19:26=
, Andrew Sandoval <<a href=3D"javascript:" target=3D"_blank" gdf-obfusca=
ted-mailto=3D"OXkiWFaEZcUJ">sand...@netwaysglobal.com</a>> wrote:
<br>> and I appreciate your suggestion. Please however, if you are=
on the
<br>> committee and intend to shoot this down no matter what, please mak=
e that
<br>> clear. This is a very time consuming process, and I don't ha=
ve any to
<br>> waste.
<br>
<br>I am in the committee, and I have no intention to shoot this down. I
<br>use RAII in loop bodies,
<br>and it's useful there. I don't use for-loops as a RAII replacement,
<br>namely because it DOES
<br>NOT WORK. :) If I throw an exception from the loop body, the for =
loop
<br>will not save me,
<br>but a RAII handle will. And if I'm using a RAII handle to cope with
<br>exceptions, I am going
<br>to use the same handle to cope with goto/break/continue/return, too.
<br></blockquote><div><br>I'm pretty sure he's talking about using RAII as =
the thing that increments the loop counter. Like this:<br><br><div class=3D=
"prettyprint" style=3D"background-color: rgb(250, 250, 250); border-color: =
rgb(187, 187, 187); border-style: solid; border-width: 1px; word-wrap: brea=
k-word;"><code class=3D"prettyprint"><div class=3D"subprettyprint"><span st=
yle=3D"color: #008;" class=3D"styled-by-prettify">int</span><span style=3D"=
color: #000;" class=3D"styled-by-prettify"> </span><span style=3D"color: #6=
60;" class=3D"styled-by-prettify">*</span><span style=3D"color: #000;" clas=
s=3D"styled-by-prettify">currValue </span><span style=3D"color: #660;" clas=
s=3D"styled-by-prettify">=3D</span><span style=3D"color: #000;" class=3D"st=
yled-by-prettify"> </span><span style=3D"color: #660;" class=3D"styled-by-p=
rettify">&</span><span style=3D"color: #000;" class=3D"styled-by-pretti=
fy">someArray</span><span style=3D"color: #660;" class=3D"styled-by-prettif=
y">[</span><span style=3D"color: #066;" class=3D"styled-by-prettify">0</spa=
n><span style=3D"color: #660;" class=3D"styled-by-prettify">];</span><span =
style=3D"color: #000;" class=3D"styled-by-prettify"><br></span><span style=
=3D"color: #008;" class=3D"styled-by-prettify">for</span><span style=3D"col=
or: #660;" class=3D"styled-by-prettify">(</span><span style=3D"color: #008;=
" class=3D"styled-by-prettify">int</span><span style=3D"color: #000;" class=
=3D"styled-by-prettify"> i </span><span style=3D"color: #660;" class=3D"sty=
led-by-prettify">=3D</span><span style=3D"color: #000;" class=3D"styled-by-=
prettify"> </span><span style=3D"color: #066;" class=3D"styled-by-prettify"=
>0</span><span style=3D"color: #660;" class=3D"styled-by-prettify">;</span>=
<span style=3D"color: #000;" class=3D"styled-by-prettify"> i </span><span s=
tyle=3D"color: #660;" class=3D"styled-by-prettify"><</span><span style=
=3D"color: #000;" class=3D"styled-by-prettify"> size</span><span style=3D"c=
olor: #660;" class=3D"styled-by-prettify">;</span><span style=3D"color: #00=
0;" class=3D"styled-by-prettify"> </span><span style=3D"color: #660;" class=
=3D"styled-by-prettify">++</span><span style=3D"color: #000;" class=3D"styl=
ed-by-prettify">i</span><span style=3D"color: #660;" class=3D"styled-by-pre=
ttify">)</span><span style=3D"color: #000;" class=3D"styled-by-prettify"><b=
r></span><span style=3D"color: #660;" class=3D"styled-by-prettify">{</span>=
<span style=3D"color: #000;" class=3D"styled-by-prettify"><br> scope<=
/span><span style=3D"color: #660;" class=3D"styled-by-prettify">(</span><sp=
an style=3D"color: #008;" class=3D"styled-by-prettify">exit</span><span sty=
le=3D"color: #660;" class=3D"styled-by-prettify">)</span><span style=3D"col=
or: #000;" class=3D"styled-by-prettify"> </span><span style=3D"color: #660;=
" class=3D"styled-by-prettify">{++</span><span style=3D"color: #000;" class=
=3D"styled-by-prettify">currValue</span><span style=3D"color: #660;" class=
=3D"styled-by-prettify">;}</span><span style=3D"color: #000;" class=3D"styl=
ed-by-prettify"> </span><span style=3D"color: #800;" class=3D"styled-by-pre=
ttify">//Every iteration will update the current value.</span><span style=
=3D"color: #000;" class=3D"styled-by-prettify"><br> </span><span styl=
e=3D"color: #800;" class=3D"styled-by-prettify">//...</span><span style=3D"=
color: #000;" class=3D"styled-by-prettify"><br> </span><span style=3D=
"color: #008;" class=3D"styled-by-prettify">if</span><span style=3D"color: =
#660;" class=3D"styled-by-prettify">(</span><span style=3D"color: #000;" cl=
ass=3D"styled-by-prettify">soemthing</span><span style=3D"color: #660;" cla=
ss=3D"styled-by-prettify">)</span><span style=3D"color: #000;" class=3D"sty=
led-by-prettify"><br> </span><span style=3D"color: #660;" class=3D"st=
yled-by-prettify">{</span><span style=3D"color: #000;" class=3D"styled-by-p=
rettify"><br> </span><span style=3D"color: #008;" class=3D"sty=
led-by-prettify">continue</span><span style=3D"color: #660;" class=3D"style=
d-by-prettify">;</span><span style=3D"color: #000;" class=3D"styled-by-pret=
tify"><br> </span><span style=3D"color: #660;" class=3D"styled-by-pre=
ttify">}</span><span style=3D"color: #000;" class=3D"styled-by-prettify"><b=
r><br> </span><span style=3D"color: #800;" class=3D"styled-by-prettif=
y">//++currValue; //old way: skipped by the continue. By accident.</span><s=
pan style=3D"color: #000;" class=3D"styled-by-prettify"><br></span><span st=
yle=3D"color: #660;" class=3D"styled-by-prettify">}</span></div></code></di=
v><br><br><br>But obviously for more complex cases.<br></div>
<p></p>
-- <br />
<br />
<br />
<br />
------=_Part_733_28199234.1352828827580--
.
Author: Ville Voutilainen <ville.voutilainen@gmail.com>
Date: Tue, 13 Nov 2012 19:49:31 +0200
Raw View
On 13 November 2012 19:47, Nicol Bolas <jmckesson@gmail.com> wrote:
>> and it's useful there. I don't use for-loops as a RAII replacement,
>> namely because it DOES
>> NOT WORK. :) If I throw an exception from the loop body, the for loop
> I'm pretty sure he's talking about using RAII as the thing that increments
> the loop counter. Like this:
Yes, and sometimes the thing that increments the counter may throw.
--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Tue, 13 Nov 2012 09:57:38 -0800 (PST)
Raw View
------=_Part_132_9812880.1352829458561
Content-Type: text/plain; charset=ISO-8859-1
On Tuesday, November 13, 2012 9:49:32 AM UTC-8, Ville Voutilainen wrote:
>
> On 13 November 2012 19:47, Nicol Bolas <jmck...@gmail.com <javascript:>>
> wrote:
> >> and it's useful there. I don't use for-loops as a RAII replacement,
> >> namely because it DOES
> >> NOT WORK. :) If I throw an exception from the loop body, the for loop
> > I'm pretty sure he's talking about using RAII as the thing that
> increments
> > the loop counter. Like this:
>
> Yes, and sometimes the thing that increments the counter may throw.
>
I'm not sure I understand your point here. So what if it does?
Now, you have a real point in the general case that more complex cleanup
has to be carefully written in the case of error. But this is not cleanup.
This is really more about abusing cleanup to increment a counter. I don't
know how that can cause a problem.
--
------=_Part_132_9812880.1352829458561
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
<br><br>On Tuesday, November 13, 2012 9:49:32 AM UTC-8, Ville Voutilainen w=
rote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8e=
x;border-left: 1px #ccc solid;padding-left: 1ex;">On 13 November 2012 19:47=
, Nicol Bolas <<a href=3D"javascript:" target=3D"_blank" gdf-obfuscated-=
mailto=3D"ZKW3FLjjTvoJ">jmck...@gmail.com</a>> wrote:
<br>>> and it's useful there. I don't use for-loops as a RAII replace=
ment,
<br>>> namely because it DOES
<br>>> NOT WORK. :) If I throw an exception from the loop body,=
the for loop
<br>> I'm pretty sure he's talking about using RAII as the thing that in=
crements
<br>> the loop counter. Like this:
<br>
<br>Yes, and sometimes the thing that increments the counter may throw.
<br></blockquote><div><br>I'm not sure I understand your point here. So wha=
t if it does?<br><br>Now, you have a real point in the general case that mo=
re complex cleanup has to be carefully written in the case of error. But th=
is is not cleanup. This is really more about abusing cleanup to increment a=
counter. I don't know how that can cause a problem.<br></div>
<p></p>
-- <br />
<br />
<br />
<br />
------=_Part_132_9812880.1352829458561--
.
Author: "Vicente J. Botet Escriba" <vicente.botet@wanadoo.fr>
Date: Tue, 13 Nov 2012 19:02:06 +0100
Raw View
This is a multi-part message in MIME format.
--------------070607040802080609090305
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: quoted-printable
Le 13/11/12 18:47, Nicol Bolas a =E9crit :
>
>
> On Tuesday, November 13, 2012 9:39:33 AM UTC-8, Ville Voutilainen wrote:
>
> On 13 November 2012 19:26, Andrew Sandoval
> <sand...@netwaysglobal.com <javascript:>> wrote:
> > and I appreciate your suggestion. Please however, if you are on
> the
> > committee and intend to shoot this down no matter what, please
> make that
> > clear. This is a very time consuming process, and I don't have
> any to
> > waste.
>
> I am in the committee, and I have no intention to shoot this down. I
> use RAII in loop bodies,
> and it's useful there. I don't use for-loops as a RAII replacement,
> namely because it DOES
> NOT WORK. :) If I throw an exception from the loop body, the for
> loop
> will not save me,
> but a RAII handle will. And if I'm using a RAII handle to cope with
> exceptions, I am going
> to use the same handle to cope with goto/break/continue/return, too.
>
>
> I'm pretty sure he's talking about using RAII as the thing that=20
> increments the loop counter. Like this:
>
> |
> int*currValue =3D&someArray[0];
> for(inti =3D0;i <size;++i)
> {
> scope(exit){++currValue;}//Every iteration will update the current=20
> value.
> //...
> if(soemthing)
> {
> continue;
> }
>
> //++currValue; //old way: skipped by the continue. By accident.
> }
> |
>
>
Hi,
The C solution to this problem is to put the scoped exit action on the=20
for, isn't it?
|
int*currValue =3D&someArray[0];
for(inti =3D0;i <size;++i,|++currValue|)
{
//...
if(soemthing)
{
continue;
}
}
|
Best,
Vicente
--=20
--------------070607040802080609090305
Content-Type: text/html; charset=ISO-8859-1
<html>
<head>
<meta content="text/html; charset=ISO-8859-1"
http-equiv="Content-Type">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<div class="moz-cite-prefix">Le 13/11/12 18:47, Nicol Bolas a
écrit :<br>
</div>
<blockquote
cite="mid:810c24b3-9bc9-4019-9fa9-faf09caaac6a@isocpp.org"
type="cite"><br>
<br>
On Tuesday, November 13, 2012 9:39:33 AM UTC-8, Ville Voutilainen
wrote:
<blockquote class="gmail_quote" style="margin: 0;margin-left:
0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;">On 13
November 2012 19:26, Andrew Sandoval <<a
moz-do-not-send="true" href="javascript:" target="_blank"
gdf-obfuscated-mailto="OXkiWFaEZcUJ">sand...@netwaysglobal.com</a>>
wrote:
<br>
> and I appreciate your suggestion. Please however, if you
are on the
<br>
> committee and intend to shoot this down no matter what,
please make that
<br>
> clear. This is a very time consuming process, and I don't
have any to
<br>
> waste.
<br>
<br>
I am in the committee, and I have no intention to shoot this
down. I
<br>
use RAII in loop bodies,
<br>
and it's useful there. I don't use for-loops as a RAII
replacement,
<br>
namely because it DOES
<br>
NOT WORK. :) If I throw an exception from the loop body, the
for loop
<br>
will not save me,
<br>
but a RAII handle will. And if I'm using a RAII handle to cope
with
<br>
exceptions, I am going
<br>
to use the same handle to cope with goto/break/continue/return,
too.
<br>
</blockquote>
<div><br>
I'm pretty sure he's talking about using RAII as the thing that
increments the loop counter. Like this:<br>
<br>
<div class="prettyprint" style="background-color: rgb(250, 250,
250); border-color: rgb(187, 187, 187); border-style: solid;
border-width: 1px; word-wrap: break-word;"><code
class="prettyprint">
<div class="subprettyprint"><span style="color: #008;"
class="styled-by-prettify">int</span><span style="color:
#000;" class="styled-by-prettify"> </span><span
style="color: #660;" class="styled-by-prettify">*</span><span
style="color: #000;" class="styled-by-prettify">currValue
</span><span style="color: #660;"
class="styled-by-prettify">=</span><span style="color:
#000;" class="styled-by-prettify"> </span><span
style="color: #660;" class="styled-by-prettify">&</span><span
style="color: #000;" class="styled-by-prettify">someArray</span><span
style="color: #660;" class="styled-by-prettify">[</span><span
style="color: #066;" class="styled-by-prettify">0</span><span
style="color: #660;" class="styled-by-prettify">];</span><span
style="color: #000;" class="styled-by-prettify"><br>
</span><span style="color: #008;"
class="styled-by-prettify">for</span><span style="color:
#660;" class="styled-by-prettify">(</span><span
style="color: #008;" class="styled-by-prettify">int</span><span
style="color: #000;" class="styled-by-prettify"> i </span><span
style="color: #660;" class="styled-by-prettify">=</span><span
style="color: #000;" class="styled-by-prettify"> </span><span
style="color: #066;" class="styled-by-prettify">0</span><span
style="color: #660;" class="styled-by-prettify">;</span><span
style="color: #000;" class="styled-by-prettify"> i </span><span
style="color: #660;" class="styled-by-prettify"><</span><span
style="color: #000;" class="styled-by-prettify"> size</span><span
style="color: #660;" class="styled-by-prettify">;</span><span
style="color: #000;" class="styled-by-prettify"> </span><span
style="color: #660;" class="styled-by-prettify">++</span><span
style="color: #000;" class="styled-by-prettify">i</span><span
style="color: #660;" class="styled-by-prettify">)</span><span
style="color: #000;" class="styled-by-prettify"><br>
</span><span style="color: #660;"
class="styled-by-prettify">{</span><span style="color:
#000;" class="styled-by-prettify"><br>
scope</span><span style="color: #660;"
class="styled-by-prettify">(</span><span style="color:
#008;" class="styled-by-prettify">exit</span><span
style="color: #660;" class="styled-by-prettify">)</span><span
style="color: #000;" class="styled-by-prettify"> </span><span
style="color: #660;" class="styled-by-prettify">{++</span><span
style="color: #000;" class="styled-by-prettify">currValue</span><span
style="color: #660;" class="styled-by-prettify">;}</span><span
style="color: #000;" class="styled-by-prettify"> </span><span
style="color: #800;" class="styled-by-prettify">//Every
iteration will update the current value.</span><span
style="color: #000;" class="styled-by-prettify"><br>
</span><span style="color: #800;"
class="styled-by-prettify">//...</span><span
style="color: #000;" class="styled-by-prettify"><br>
</span><span style="color: #008;"
class="styled-by-prettify">if</span><span style="color:
#660;" class="styled-by-prettify">(</span><span
style="color: #000;" class="styled-by-prettify">soemthing</span><span
style="color: #660;" class="styled-by-prettify">)</span><span
style="color: #000;" class="styled-by-prettify"><br>
</span><span style="color: #660;"
class="styled-by-prettify">{</span><span style="color:
#000;" class="styled-by-prettify"><br>
</span><span style="color: #008;"
class="styled-by-prettify">continue</span><span
style="color: #660;" class="styled-by-prettify">;</span><span
style="color: #000;" class="styled-by-prettify"><br>
</span><span style="color: #660;"
class="styled-by-prettify">}</span><span style="color:
#000;" class="styled-by-prettify"><br>
<br>
</span><span style="color: #800;"
class="styled-by-prettify">//++currValue; //old way:
skipped by the continue. By accident.</span><span
style="color: #000;" class="styled-by-prettify"><br>
</span><span style="color: #660;"
class="styled-by-prettify">}</span></div>
</code></div>
<br>
<br>
</div>
</blockquote>
Hi,<br>
<br>
The C solution to this problem is to put the scoped exit action on
the for, isn't it?<br>
<br>
<div class="prettyprint" style="background-color: rgb(250, 250,
250); border-color: rgb(187, 187, 187); border-style: solid;
border-width: 1px; word-wrap: break-word;"><code
class="prettyprint">
<div class="subprettyprint"><span style="color: #008;"
class="styled-by-prettify">int</span><span style="color:
#000;" class="styled-by-prettify"> </span><span
style="color: #660;" class="styled-by-prettify">*</span><span
style="color: #000;" class="styled-by-prettify">currValue </span><span
style="color: #660;" class="styled-by-prettify">=</span><span
style="color: #000;" class="styled-by-prettify"> </span><span
style="color: #660;" class="styled-by-prettify">&</span><span
style="color: #000;" class="styled-by-prettify">someArray</span><span
style="color: #660;" class="styled-by-prettify">[</span><span
style="color: #066;" class="styled-by-prettify">0</span><span
style="color: #660;" class="styled-by-prettify">];</span><span
style="color: #000;" class="styled-by-prettify"><br>
</span><span style="color: #008;" class="styled-by-prettify">for</span><span
style="color: #660;" class="styled-by-prettify">(</span><span
style="color: #008;" class="styled-by-prettify">int</span><span
style="color: #000;" class="styled-by-prettify"> i </span><span
style="color: #660;" class="styled-by-prettify">=</span><span
style="color: #000;" class="styled-by-prettify"> </span><span
style="color: #066;" class="styled-by-prettify">0</span><span
style="color: #660;" class="styled-by-prettify">;</span><span
style="color: #000;" class="styled-by-prettify"> i </span><span
style="color: #660;" class="styled-by-prettify"><</span><span
style="color: #000;" class="styled-by-prettify"> size</span><span
style="color: #660;" class="styled-by-prettify">;</span><span
style="color: #000;" class="styled-by-prettify"> </span><span
style="color: #660;" class="styled-by-prettify">++</span><span
style="color: #000;" class="styled-by-prettify">i</span><span
style="color: #660;" class="styled-by-prettify">,</span><span
style="color: #660;" class="styled-by-prettify"><code
class="prettyprint"><span style="color: #660;"
class="styled-by-prettify">++</span><span style="color:
#000;" class="styled-by-prettify">currValue</span><span
style="color: #660;" class="styled-by-prettify"></span></code>)</span><span
style="color: #000;" class="styled-by-prettify"><br>
</span><span style="color: #660;" class="styled-by-prettify">{</span><span
style="color: #000;" class="styled-by-prettify"><br>
</span><span style="color: #000;" class="styled-by-prettify">
</span><span style="color: #800;" class="styled-by-prettify">//...</span><span
style="color: #000;" class="styled-by-prettify"><br>
</span><span style="color: #008;"
class="styled-by-prettify">if</span><span style="color:
#660;" class="styled-by-prettify">(</span><span
style="color: #000;" class="styled-by-prettify">soemthing</span><span
style="color: #660;" class="styled-by-prettify">)</span><span
style="color: #000;" class="styled-by-prettify"><br>
</span><span style="color: #660;"
class="styled-by-prettify">{</span><span style="color:
#000;" class="styled-by-prettify"><br>
</span><span style="color: #008;"
class="styled-by-prettify">continue</span><span
style="color: #660;" class="styled-by-prettify">;</span><span
style="color: #000;" class="styled-by-prettify"><br>
</span><span style="color: #660;"
class="styled-by-prettify">}</span><span style="color:
#000;" class="styled-by-prettify"><br>
</span><span style="color: #660;" class="styled-by-prettify">}</span></div>
</code></div>
<br>
<br>
Best,<br>
Vicente<br>
<br>
<br>
</body>
</html>
<p></p>
-- <br />
<br />
<br />
<br />
--------------070607040802080609090305--
.
Author: Ville Voutilainen <ville.voutilainen@gmail.com>
Date: Tue, 13 Nov 2012 20:02:15 +0200
Raw View
On 13 November 2012 19:57, Nicol Bolas <jmckesson@gmail.com> wrote:
>> Yes, and sometimes the thing that increments the counter may throw.
> I'm not sure I understand your point here. So what if it does?
> Now, you have a real point in the general case that more complex cleanup has
> to be carefully written in the case of error. But this is not cleanup. This
> is really more about abusing cleanup to increment a counter. I don't know
> how that can cause a problem.
I may want to use the counter's value after the loop, and I may want
it to advance
no matter what happens in the loop. Ok, this is a bit theoretical, and
I think the loop
example, if used, needs to be bit more motivating. ;)
--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Tue, 13 Nov 2012 10:11:12 -0800 (PST)
Raw View
------=_Part_51_18308891.1352830272951
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
On Tuesday, November 13, 2012 10:02:09 AM UTC-8, viboes wrote:
>
> Le 13/11/12 18:47, Nicol Bolas a =E9crit :
> =20
>
>
> On Tuesday, November 13, 2012 9:39:33 AM UTC-8, Ville Voutilainen wrote:=
=20
>>
>> On 13 November 2012 19:26, Andrew Sandoval <sand...@netwaysglobal.com>=
=20
>> wrote:=20
>> > and I appreciate your suggestion. Please however, if you are on the=
=20
>> > committee and intend to shoot this down no matter what, please make=20
>> that=20
>> > clear. This is a very time consuming process, and I don't have any to=
=20
>> > waste.=20
>>
>> I am in the committee, and I have no intention to shoot this down. I=20
>> use RAII in loop bodies,=20
>> and it's useful there. I don't use for-loops as a RAII replacement,=20
>> namely because it DOES=20
>> NOT WORK. :) If I throw an exception from the loop body, the for loop=
=20
>> will not save me,=20
>> but a RAII handle will. And if I'm using a RAII handle to cope with=20
>> exceptions, I am going=20
>> to use the same handle to cope with goto/break/continue/return, too.=20
>>
>
> I'm pretty sure he's talking about using RAII as the thing that increment=
s=20
> the loop counter. Like this:
>
> int *currValue =3D &someArray[0];
> for(int i =3D 0; i < size; ++i)
> {
> scope(exit) {++currValue;} //Every iteration will update the current=20
> value.
> //...
> if(soemthing)
> {
> continue;
> }
>
> //++currValue; //old way: skipped by the continue. By accident.
> }
> =20
>
> Hi,
>
> The C solution to this problem is to put the scoped exit action on the=20
> for, isn't it?
>
> int *currValue =3D &someArray[0];
> for(int i =3D 0; i < size; ++i,++currValue)
> {
> //...
> if(soemthing)
> {
> continue;
> }
> }
> =20
>
> Best,
> Vicente
>
>
>
As I said, it would be used for more complex incrementing than something=20
that could fit in a for-loop expression (or for non-for loops).=20
--=20
------=_Part_51_18308891.1352830272951
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
<br><br>On Tuesday, November 13, 2012 10:02:09 AM UTC-8, viboes wrote:<bloc=
kquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-l=
eft: 1px #ccc solid;padding-left: 1ex;">
=20
=20
=20
<div bgcolor=3D"#FFFFFF" text=3D"#000000">
<div>Le 13/11/12 18:47, Nicol Bolas a
=E9crit :<br>
</div>
<blockquote type=3D"cite"><br>
<br>
On Tuesday, November 13, 2012 9:39:33 AM UTC-8, Ville Voutilainen
wrote:
<blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex=
;border-left:1px #ccc solid;padding-left:1ex">On 13
November 2012 19:26, Andrew Sandoval <<a>sand...@netwaysglobal.c=
om</a>>
wrote:
<br>
> and I appreciate your suggestion. Please however, if you
are on the
<br>
> committee and intend to shoot this down no matter what,
please make that
<br>
> clear. This is a very time consuming process, and I don'=
t
have any to
<br>
> waste.
<br>
<br>
I am in the committee, and I have no intention to shoot this
down. I
<br>
use RAII in loop bodies,
<br>
and it's useful there. I don't use for-loops as a RAII
replacement,
<br>
namely because it DOES
<br>
NOT WORK. :) If I throw an exception from the loop body, the
for loop
<br>
will not save me,
<br>
but a RAII handle will. And if I'm using a RAII handle to cope
with
<br>
exceptions, I am going
<br>
to use the same handle to cope with goto/break/continue/return,
too.
<br>
</blockquote>
<div><br>
I'm pretty sure he's talking about using RAII as the thing that
increments the loop counter. Like this:<br>
<br>
<div style=3D"background-color:rgb(250,250,250);border-color:rgb(18=
7,187,187);border-style:solid;border-width:1px;word-wrap:break-word"><code>
<div><span style=3D"color:#008">int</span><span style=3D"color:=
#000"> </span><span style=3D"color:#660">*</span><span style=3D"color:#000"=
>currValue
</span><span style=3D"color:#660">=3D</span><span style=3D"co=
lor:#000"> </span><span style=3D"color:#660">&</span><span style=3D"col=
or:#000">someArray</span><span style=3D"color:#660">[</span><span style=3D"=
color:#066">0</span><span style=3D"color:#660">];</span><span style=3D"colo=
r:#000"><br>
</span><span style=3D"color:#008">for</span><span style=3D"co=
lor:#660">(</span><span style=3D"color:#008">int</span><span style=3D"color=
:#000"> i </span><span style=3D"color:#660">=3D</span><span style=3D"color:=
#000"> </span><span style=3D"color:#066">0</span><span style=3D"color:#660"=
>;</span><span style=3D"color:#000"> i </span><span style=3D"color:#660">&l=
t;</span><span style=3D"color:#000"> size</span><span style=3D"color:#660">=
;</span><span style=3D"color:#000"> </span><span style=3D"color:#660">++</s=
pan><span style=3D"color:#000">i</span><span style=3D"color:#660">)</span><=
span style=3D"color:#000"><br>
</span><span style=3D"color:#660">{</span><span style=3D"colo=
r:#000"><br>
scope</span><span style=3D"color:#660">(</span><span=
style=3D"color:#008">exit</span><span style=3D"color:#660">)</span><span s=
tyle=3D"color:#000"> </span><span style=3D"color:#660">{++</span><span styl=
e=3D"color:#000">currValue</span><span style=3D"color:#660">;}</span><span =
style=3D"color:#000"> </span><span style=3D"color:#800">//Every
iteration will update the current value.</span><span style=
=3D"color:#000"><br>
</span><span style=3D"color:#800">//...</span><span =
style=3D"color:#000"><br>
</span><span style=3D"color:#008">if</span><span sty=
le=3D"color:#660">(</span><span style=3D"color:#000">soemthing</span><span =
style=3D"color:#660">)</span><span style=3D"color:#000"><br>
</span><span style=3D"color:#660">{</span><span styl=
e=3D"color:#000"><br>
</span><span style=3D"color:#008">continue</s=
pan><span style=3D"color:#660">;</span><span style=3D"color:#000"><br>
</span><span style=3D"color:#660">}</span><span styl=
e=3D"color:#000"><br>
<br>
</span><span style=3D"color:#800">//++currValue; //o=
ld way:
skipped by the continue. By accident.</span><span style=3D"=
color:#000"><br>
</span><span style=3D"color:#660">}</span></div>
</code></div>
<br>
<br>
</div>
</blockquote>
Hi,<br>
<br>
The C solution to this problem is to put the scoped exit action on
the for, isn't it?<br>
<br>
<div style=3D"background-color:rgb(250,250,250);border-color:rgb(187,18=
7,187);border-style:solid;border-width:1px;word-wrap:break-word"><code>
<div><span style=3D"color:#008">int</span><span style=3D"color:#000=
"> </span><span style=3D"color:#660">*</span><span style=3D"color:#000">cur=
rValue </span><span style=3D"color:#660">=3D</span><span style=3D"color:#00=
0"> </span><span style=3D"color:#660">&</span><span style=3D"color:#000=
">someArray</span><span style=3D"color:#660">[</span><span style=3D"color:#=
066">0</span><span style=3D"color:#660">];</span><span style=3D"color:#000"=
><br>
</span><span style=3D"color:#008">for</span><span style=3D"color:=
#660">(</span><span style=3D"color:#008">int</span><span style=3D"color:#00=
0"> i </span><span style=3D"color:#660">=3D</span><span style=3D"color:#000=
"> </span><span style=3D"color:#066">0</span><span style=3D"color:#660">;</=
span><span style=3D"color:#000"> i </span><span style=3D"color:#660"><</=
span><span style=3D"color:#000"> size</span><span style=3D"color:#660">;</s=
pan><span style=3D"color:#000"> </span><span style=3D"color:#660">++</span>=
<span style=3D"color:#000">i</span><span style=3D"color:#660">,</span><span=
style=3D"color:#660"><code><span style=3D"color:#660">++</span><span style=
=3D"color:#000">currValue</span><span style=3D"color:#660"></span></code>)<=
/span><span style=3D"color:#000"><br>
</span><span style=3D"color:#660">{</span><span style=3D"color:#0=
00"><br>
</span><span style=3D"color:#000">
</span><span style=3D"color:#800">//...</span><span style=3D"colo=
r:#000"><br>
</span><span style=3D"color:#008">if</span><span style=
=3D"color:#660">(</span><span style=3D"color:#000">soemthing</span><span st=
yle=3D"color:#660">)</span><span style=3D"color:#000"><br>
</span><span style=3D"color:#660">{</span><span style=3D=
"color:#000"><br>
</span><span style=3D"color:#008">continue</span>=
<span style=3D"color:#660">;</span><span style=3D"color:#000"><br>
</span><span style=3D"color:#660">}</span><span style=3D=
"color:#000"><br>
</span><span style=3D"color:#660">}</span></div>
</code></div>
<br>
<br>
Best,<br>
Vicente<br>
<br>
<br></div></blockquote><div><br>As I said, it would be used for more co=
mplex incrementing than something that could fit in a for-loop expression (=
or for non-for loops). <br></div>
<p></p>
-- <br />
<br />
<br />
<br />
------=_Part_51_18308891.1352830272951--
.
Author: "Vicente J. Botet Escriba" <vicente.botet@wanadoo.fr>
Date: Tue, 13 Nov 2012 20:30:49 +0100
Raw View
This is a multi-part message in MIME format.
--------------030106000008050406010802
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: quoted-printable
Le 13/11/12 08:48, Andrew Sandoval a =E9crit :
> For those willing to take a look at the proposal as a very rough=20
> draft, it can be found here: http://www.andrewlsandoval.com/scope_exit/
>
> The Technical Specification section is completely blank. Judging by=20
> the examples (and by my understanding of them) this portion will=20
> probably take me several days. Of course, I'm grateful for any help,=20
> from anyone else that would like to see this functionality added to=20
> the Standard Library. And similarly for any feedback on the document=20
> as it currently stands. This is my first shot at this kind of thing! =20
> So be gentle please! ;)
>
Hi,
I don't think you need to add on your proposal the types returned by the=20
scoped_exit function. Just propose a function that returns an=20
implementation defined type that provides a specific behavior.
I'm for the first overloading, which corresponds to the interface=20
Boost.ScopedExit has to make code portable.
The example motivating the second overload not convince me as we can use=20
the simpler scoped_exit overload
Instead of
|
void drive_any_available_bus()
{
auto &&bus =3D std::scope_exit(lock_available_bus(), unlock_bus); =
// Always unlock the bus when done driving... No need to verify the resour=
ce first
if(bus =3D=3D -1)
{
return; // No buses...
}
drive(bus);
}
|the following should do the same
|
void drive_any_available_bus()
{
if(lock_available_bus()|| =3D=3D -1) return;
|
auto &&bus =3D std::scope_exit(unlock_bus);
|
drive(bus);
}||
|The same applies to the third overload
|
// Open a file, ensure it is closed when we leave scope, if the file descri=
ptor is valid...
auto&& iFileDesc =3D std::scope_exit(_open(pszPath, O_WRONLY), _close, -1);=
// if _open returns -1, don't call _close...
if(iFileDesc.valid())
{
_write(iFileDesc, &data, sizeof(data));
}
||
could be replaced by
|
|
|
||
|
|
|
auto fd =3D _open(pszPath, O_WRONLY);|||
if (fd !=3D -1) return; // ...||
||
auto&& guard =3D std::scope_exit( [&fd] { _close(fd); } );
||||
_write(iFileDesc, &data, sizeof(data));
||||||The last example concerns a resource wrapper with implicit=20
conversion to the underlying resource. One of the problems with implicit=20
conversions is that some overloads can be missed.
When wrapping a resource an alternative approach is to provide the=20
specific functions, in your case define a File wrapper, but there is no=20
need for a generic scoped_resource to implement it.
In particular the example could be implemented as
|class TestClassMember3
{
private:
FILE m_hEvent;
public:
TestClassMember2() : m_hEvent(CreateEvent(nullptr, TRUE, FALSE, nullpt=
r))
{
}
~TestClassMember()
{
|||CloseHandle|(|||m_hEvent|);
}
// Other stuff here...
};|
Resuming the simple scoped_exit is enough to make a useful C++14=20
proposal that covers all the examples you have on your current proposal=20
and could have good chances to be accepted.
Of course this doesn't covers all the classes you wanted to propose, but ..=
..
The proposal could be complemented with scoped_success, scoped_failure=20
(based on D language). This could be possible updating=20
|std::uncaught_exception| or any other mechanism so that failure or=20
success conditions can be determined.
Just my 2 euro cents,
Vicente
--=20
--------------030106000008050406010802
Content-Type: text/html; charset=ISO-8859-1
<html>
<head>
<meta content="text/html; charset=ISO-8859-1"
http-equiv="Content-Type">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<div class="moz-cite-prefix">Le 13/11/12 08:48, Andrew Sandoval a
écrit :<br>
</div>
<blockquote
cite="mid:8d688035-cddb-45cb-986d-c1e739680bf9@isocpp.org"
type="cite">For those willing to take a look at the proposal as a
very rough draft, it can be found here: <a moz-do-not-send="true"
href="http://www.andrewlsandoval.com/scope_exit/">http://www.andrewlsandoval.com/scope_exit/</a><br>
<br>
The Technical Specification section is completely blank. Judging
by the examples (and by my understanding of them) this portion
will probably take me several days. Of course, I'm grateful for
any help, from anyone else that would like to see this
functionality added to the Standard Library. And similarly for
any feedback on the document as it currently stands. This is my
first shot at this kind of thing! So be gentle please! ;)<br>
<br>
</blockquote>
Hi,<br>
<br>
I don't think you need to add on your proposal the types returned by
the scoped_exit function. Just propose a function that returns an
implementation defined type that provides a specific behavior.<br>
<br>
I'm for the first overloading, which corresponds to the interface
Boost.ScopedExit has to make code portable.<br>
<br>
The example motivating the second overload not convince me as we can
use the simpler scoped_exit overload<br>
<br>
Instead of <br>
<meta http-equiv="content-type" content="text/html;
charset=ISO-8859-1">
<code>
<pre>void drive_any_available_bus()
{
auto &&bus = std::scope_exit(lock_available_bus(), unlock_bus); // Always unlock the bus when done driving... No need to verify the resource first
if(bus == -1)
{
return; // No buses...
}
drive(bus);
}</pre>
</code>the following should do the same<br>
<meta http-equiv="content-type" content="text/html;
charset=ISO-8859-1">
<code>
<pre>void drive_any_available_bus()
{
if(lock_available_bus()<code></code> == -1) return;
<code><pre> auto &&bus = std::scope_exit(unlock_bus);
</pre></code> drive(bus);
}<code></code></pre>
</code>The same applies to the third overload<br>
<br>
<meta http-equiv="content-type" content="text/html;
charset=ISO-8859-1">
<code>
<pre>// Open a file, ensure it is closed when we leave scope, if the file descriptor is valid...
auto&& iFileDesc = std::scope_exit(_open(pszPath, O_WRONLY), _close, -1); // if _open returns -1, don't call _close...
if(iFileDesc.valid())
{
_write(iFileDesc, &data, sizeof(data));
}
</pre>
</code><code>
<pre>could be replaced by</pre>
</code><br>
<code>
<pre></pre>
</code>
<pre><code><code><pre><code><pre><code><pre><code><pre>auto fd = _open(pszPath, O_WRONLY);</pre></code></pre></code></pre></code>if (fd != -1) return; // ...</pre></code></code></pre>
<code><code>
<pre>auto&& guard = std::scope_exit( [&fd] { _close(fd); } );</pre>
</code></code><code><code>
<pre>_write(iFileDesc, &data, sizeof(data));
</pre>
</code></code><code><code></code></code>The last example concerns
a resource wrapper with implicit conversion to the underlying
resource. One of the problems with implicit conversions is that some
overloads can be missed. <br>
When wrapping a resource an alternative approach is to provide the
specific functions, in your case define a File wrapper, but there is
no need for a generic scoped_resource to implement it.<br>
<br>
In particular the example could be implemented as<br>
<pre><code>class TestClassMember3
{
private:
FILE m_hEvent;
public:
TestClassMember2() : m_hEvent(CreateEvent(nullptr, TRUE, FALSE, nullptr))
{
}
~TestClassMember()
{
</code><code><code>CloseHandle</code>(</code><code><code>m_hEvent</code>);
}
// Other stuff here...
};</code></pre>
Resuming the simple scoped_exit is enough to make a useful C++14
proposal that covers all the examples you have on your current
proposal and could have good chances to be accepted.<br>
Of course this doesn't covers all the classes you wanted to propose,
but ...<br>
<br>
The proposal could be complemented with scoped_success,
scoped_failure (based on D language). This could be possible
updating <code class="computeroutput"><span class="identifier">std</span><span
class="special">::</span><span class="identifier">uncaught_exception</span></code>
or any other mechanism so that failure or success conditions can be
determined.<br>
<br>
Just my 2 euro cents,<br>
Vicente<br>
<br>
<br>
<br>
<br>
<br>
<br>
</body>
</html>
<p></p>
-- <br />
<br />
<br />
<br />
--------------030106000008050406010802--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Tue, 13 Nov 2012 11:59:31 -0800 (PST)
Raw View
------=_Part_31_30303411.1352836771181
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
On Tuesday, November 13, 2012 11:30:53 AM UTC-8, viboes wrote:
>
> Le 13/11/12 08:48, Andrew Sandoval a =E9crit :
> =20
> For those willing to take a look at the proposal as a very rough draft, i=
t=20
> can be found here: http://www.andrewlsandoval.com/scope_exit/
>
> The Technical Specification section is completely blank. Judging by the=
=20
> examples (and by my understanding of them) this portion will probably tak=
e=20
> me several days. Of course, I'm grateful for any help, from anyone else=
=20
> that would like to see this functionality added to the Standard Library. =
=20
> And similarly for any feedback on the document as it currently stands. =
=20
> This is my first shot at this kind of thing! So be gentle please! ;)
>
> Hi,
>
> I don't think you need to add on your proposal the types returned by the=
=20
> scoped_exit function. Just propose a function that returns an=20
> implementation defined type that provides a specific behavior.
>
> I'm for the first overloading, which corresponds to the interface=20
> Boost.ScopedExit has to make code portable.
>
> The example motivating the second overload not convince me as we can use=
=20
> the simpler scoped_exit overload
>
> Instead of=20
> =20
> void drive_any_available_bus()
> {
> auto &&bus =3D std::scope_exit(lock_available_bus(), unlock_bus); =
// Always unlock the bus when done driving... No need to verify the resou=
rce first
> if(bus =3D=3D -1)
> {
> return; // No buses...
> }
> drive(bus);
> }
>
> the following should do the same
> =20
> void drive_any_available_bus()
> {
> if(lock_available_bus() =3D=3D -1) return;
>
> auto &&bus =3D std::scope_exit(unlock_bus);
>
> drive(bus); }
>
> The same applies to the third overload
>
> // Open a file, ensure it is closed when we leave scope, if the file des=
criptor is valid...
> auto&& iFileDesc =3D std::scope_exit(_open(pszPath, O_WRONLY), _close, -1=
); // if _open returns -1, don't call _close...
> if(iFileDesc.valid())
> {
> _write(iFileDesc, &data, sizeof(data));
> }
>
>
> could be replaced by
>
>
> auto fd =3D _open(pszPath, O_WRONLY);
>
> if (fd !=3D -1) return; // ...
>
> auto&& guard =3D std::scope_exit( [&fd] { _close(fd); } );
>
> _write(iFileDesc, &data, sizeof(data));
>
> The last example concerns a resource wrapper with implicit conversion to=
=20
> the underlying resource. One of the problems with implicit conversions is=
=20
> that some overloads can be missed.=20
> When wrapping a resource an alternative approach is to provide the=20
> specific functions, in your case define a File wrapper, but there is no=
=20
> need for a generic scoped_resource to implement it.
>
> In particular the example could be implemented as
>
> class TestClassMember3
> {
> private:
> FILE m_hEvent;
> public:
> TestClassMember2() : m_hEvent(CreateEvent(nullptr, TRUE, FALSE, nullp=
tr))
> {
> }
>
> ~TestClassMember()=20
> {
> CloseHandle(m_hEvent);
> }=20
> // Other stuff here...
> };
>
> Resuming the simple scoped_exit is enough to make a useful C++14 proposal=
=20
> that covers all the examples you have on your current proposal and could=
=20
> have good chances to be accepted.
> Of course this doesn't covers all the classes you wanted to propose, but=
=20
> ...
>
> The proposal could be complemented with scoped_success, scoped_failure=20
> (based on D language). This could be possible updating std::
> uncaught_exception or any other mechanism so that failure or success=20
> conditions can be determined.
>
That's the thing: if it's going to happen, I would much rather it *be* a=20
language feature. Just compare the code:
auto &&log_status_on_exit =3D std::scope_exit([&status, &modifier]() ->void
{
LogStatus(status, "SomeFunction", modifier);
});
vs:
scope(exit)
{
LogStatus(status, "SomeFunction", modifier);
}
Isn't that so much better? No messy variables to create. No name=20
collisions. No lambdas, and therefore no need to explicitly include=20
anything in scope. It's immediately clear what it does.
That way, you don't need to modify std::uncaught_exception or anything like=
=20
that. The system will call the `scope(failure)` at the correct time.
>
--=20
------=_Part_31_30303411.1352836771181
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
<br><br>On Tuesday, November 13, 2012 11:30:53 AM UTC-8, viboes wrote:<bloc=
kquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-l=
eft: 1px #ccc solid;padding-left: 1ex;">
=20
=20
=20
<div bgcolor=3D"#FFFFFF" text=3D"#000000">
<div>Le 13/11/12 08:48, Andrew Sandoval a
=E9crit :<br>
</div>
<blockquote type=3D"cite">For those willing to take a look at the propo=
sal as a
very rough draft, it can be found here: <a href=3D"http://www.andrewl=
sandoval.com/scope_exit/" target=3D"_blank">http://www.andrewlsandoval.<wbr=
>com/scope_exit/</a><br>
<br>
The Technical Specification section is completely blank. Judgin=
g
by the examples (and by my understanding of them) this portion
will probably take me several days. Of course, I'm grateful for
any help, from anyone else that would like to see this
functionality added to the Standard Library. And similarly for
any feedback on the document as it currently stands. This is my
first shot at this kind of thing! So be gentle please! ;)<br>
<br>
</blockquote>
Hi,<br>
<br>
I don't think you need to add on your proposal the types returned by
the scoped_exit function. Just propose a function that returns an
implementation defined type that provides a specific behavior.<br>
<br>
I'm for the first overloading, which corresponds to the interface
Boost.ScopedExit has to make code portable.<br>
<br>
The example motivating the second overload not convince me as we can
use the simpler scoped_exit overload<br>
<br>
Instead of <br>
=20
<code>
<pre>void drive_any_available_bus()
{
auto &&bus =3D std::scope_exit(lock_<wbr>available_bus(), unloc=
k_bus); // Always unlock the bus when done driving... No need to verif=
y the resource first
if(bus =3D=3D -1)
{
return; // No buses...
}
drive(bus);
}</pre>
</code>the following should do the same<br>
=20
<code>
<pre>void drive_any_available_bus()
{
if(lock_available_bus()<code></code> =3D=3D -1) return;
<code><pre> auto &&bus =3D std::scope_exit(unlock_bus);
</pre></code> drive(bus);
}<code></code></pre>
</code>The same applies to the third overload<br>
<br>
=20
<code>
<pre>// Open a file, ensure it is closed when we leave scope, if the =
file descriptor is valid...
auto&& iFileDesc =3D std::scope_exit(_open(pszPath, O_WRONLY), _clo=
se, -1); // if _open returns -1, don't call _close...
if(iFileDesc.valid())
{
_write(iFileDesc, &data, sizeof(data));
}
</pre>
</code><code>
<pre>could be replaced by</pre>
</code><br>
<code>
<pre></pre>
</code>
<pre><code><code><pre><code><pre><code><pre><code><pre>auto fd =3D _ope=
n(pszPath, O_WRONLY);</pre></code></pre></code></pre></code>if (fd !=3D -1)=
return; // ...</pre></code></code></pre>
<code><code>
<pre>auto&& guard =3D std::scope_exit( [&fd] { _close(=
fd); } );</pre>
</code></code><code><code>
<pre>_write(iFileDesc, &data, sizeof(data));
</pre>
</code></code><code><code></code></code>The last example concerns
a resource wrapper with implicit conversion to the underlying
resource. One of the problems with implicit conversions is that some
overloads can be missed. <br>
When wrapping a resource an alternative approach is to provide the
specific functions, in your case define a File wrapper, but there is
no need for a generic scoped_resource to implement it.<br>
<br>
In particular the example could be implemented as<br>
<pre><code>class TestClassMember3
{
private:
FILE m_hEvent;
public:
TestClassMember2() : m_hEvent(CreateEvent(nullptr, TRUE, FALSE, nullptr=
))
{
}
~TestClassMember()=20
{
</code><code><code>CloseHandle</code>(</code><code><code>m_hEvent</=
code>);
}=20
// Other stuff here...
};</code></pre>
Resuming the simple scoped_exit is enough to make a useful C++14
proposal that covers all the examples you have on your current
proposal and could have good chances to be accepted.<br>
Of course this doesn't covers all the classes you wanted to propose,
but ...<br>
<br>
The proposal could be complemented with scoped_success,
scoped_failure (based on D language). This could be possible
updating <code><span>std</span><span>::</span><span>uncaught_exception<=
/span></code>
or any other mechanism so that failure or success conditions can be
determined.<br></div></blockquote><div bgcolor=3D"#FFFFFF" text=3D"#000=
000"><br>That's the thing: if it's going to happen, I would much rather it =
<i>be</i> a language feature. Just compare the code:<br><br><div class=3D"p=
rettyprint" style=3D"background-color: rgb(250, 250, 250); border-color: rg=
b(187, 187, 187); border-style: solid; border-width: 1px; word-wrap: break-=
word;"><code class=3D"prettyprint"><div class=3D"subprettyprint"><span styl=
e=3D"color: #008;" class=3D"styled-by-prettify">auto</span><span style=3D"c=
olor: #000;" class=3D"styled-by-prettify"> </span><span style=3D"color: #66=
0;" class=3D"styled-by-prettify">&&</span><span style=3D"color: #00=
0;" class=3D"styled-by-prettify">log_status_on_exit </span><span style=3D"c=
olor: #660;" class=3D"styled-by-prettify">=3D</span><span style=3D"color: #=
000;" class=3D"styled-by-prettify"> std</span><span style=3D"color: #660;" =
class=3D"styled-by-prettify">::</span><span style=3D"color: #000;" class=3D=
"styled-by-prettify">scope_exit</span><span style=3D"color: #660;" class=3D=
"styled-by-prettify">([&</span><span style=3D"color: #000;" class=3D"st=
yled-by-prettify">status</span><span style=3D"color: #660;" class=3D"styled=
-by-prettify">,</span><span style=3D"color: #000;" class=3D"styled-by-prett=
ify"> </span><span style=3D"color: #660;" class=3D"styled-by-prettify">&=
;</span><span style=3D"color: #000;" class=3D"styled-by-prettify">modifier<=
/span><span style=3D"color: #660;" class=3D"styled-by-prettify">]()</span><=
span style=3D"color: #000;" class=3D"styled-by-prettify"> </span><span styl=
e=3D"color: #660;" class=3D"styled-by-prettify">-></span><span style=3D"=
color: #008;" class=3D"styled-by-prettify">void</span><span style=3D"color:=
#000;" class=3D"styled-by-prettify"><br></span><span style=3D"color: #660;=
" class=3D"styled-by-prettify">{</span><span style=3D"color: #000;" class=
=3D"styled-by-prettify"><br> </span><span style=3D"color: #606;" clas=
s=3D"styled-by-prettify">LogStatus</span><span style=3D"color: #660;" class=
=3D"styled-by-prettify">(</span><span style=3D"color: #000;" class=3D"style=
d-by-prettify">status</span><span style=3D"color: #660;" class=3D"styled-by=
-prettify">,</span><span style=3D"color: #000;" class=3D"styled-by-prettify=
"> </span><span style=3D"color: #080;" class=3D"styled-by-prettify">"SomeFu=
nction"</span><span style=3D"color: #660;" class=3D"styled-by-prettify">,</=
span><span style=3D"color: #000;" class=3D"styled-by-prettify"> modifier</s=
pan><span style=3D"color: #660;" class=3D"styled-by-prettify">);</span><spa=
n style=3D"color: #000;" class=3D"styled-by-prettify"><br></span><span styl=
e=3D"color: #660;" class=3D"styled-by-prettify">});</span><span style=3D"co=
lor: #000;" class=3D"styled-by-prettify"><br></span></div></code></div><br>=
vs:<br><br><div class=3D"prettyprint" style=3D"background-color: rgb(250, 2=
50, 250); border-color: rgb(187, 187, 187); border-style: solid; border-wid=
th: 1px; word-wrap: break-word;"><code class=3D"prettyprint"><div class=3D"=
subprettyprint"><span style=3D"color: #000;" class=3D"styled-by-prettify">s=
cope</span><span style=3D"color: #660;" class=3D"styled-by-prettify">(</spa=
n><span style=3D"color: #008;" class=3D"styled-by-prettify">exit</span><spa=
n style=3D"color: #660;" class=3D"styled-by-prettify">)</span><span style=
=3D"color: #000;" class=3D"styled-by-prettify"><br></span><span style=3D"co=
lor: #660;" class=3D"styled-by-prettify">{</span><span style=3D"color: #000=
;" class=3D"styled-by-prettify"><br> </span><span style=3D"color: #60=
6;" class=3D"styled-by-prettify">LogStatus</span><span style=3D"color: #660=
;" class=3D"styled-by-prettify">(</span><span style=3D"color: #000;" class=
=3D"styled-by-prettify">status</span><span style=3D"color: #660;" class=3D"=
styled-by-prettify">,</span><span style=3D"color: #000;" class=3D"styled-by=
-prettify"> </span><span style=3D"color: #080;" class=3D"styled-by-prettify=
">"SomeFunction"</span><span style=3D"color: #660;" class=3D"styled-by-pret=
tify">,</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> mo=
difier</span><span style=3D"color: #660;" class=3D"styled-by-prettify">);</=
span><span style=3D"color: #000;" class=3D"styled-by-prettify"><br></span><=
span style=3D"color: #660;" class=3D"styled-by-prettify">}</span><span styl=
e=3D"color: #000;" class=3D"styled-by-prettify"><br></span></div></code></d=
iv><br>Isn't that so much better? No messy variables to create. No name col=
lisions. No lambdas, and therefore no need to explicitly include anything i=
n scope. It's immediately clear what it does.<br><br>That way, you don't ne=
ed to modify std::uncaught_exception or anything like that. The system will=
call the `scope(failure)` at the correct time.<br>
</div><blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0=
..8ex;border-left: 1px #ccc solid;padding-left: 1ex;">
</blockquote>
<p></p>
-- <br />
<br />
<br />
<br />
------=_Part_31_30303411.1352836771181--
.
Author: "Vicente J. Botet Escriba" <vicente.botet@wanadoo.fr>
Date: Tue, 13 Nov 2012 22:22:06 +0100
Raw View
This is a multi-part message in MIME format.
--------------050405030807040608040704
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: quoted-printable
Le 13/11/12 20:59, Nicol Bolas a =E9crit :
>
>
> On Tuesday, November 13, 2012 11:30:53 AM UTC-8, viboes wrote:
>
> Le 13/11/12 08:48, Andrew Sandoval a =E9crit :
>
>
> The proposal could be complemented with scoped_success,
> scoped_failure (based on D language). This could be possible
> updating |std::uncaught_exception| or any other mechanism so that
> failure or success conditions can be determined.
>
>
> That's the thing: if it's going to happen, I would much rather it /be/=20
> a language feature. Just compare the code:
>
> |
> auto&&log_status_on_exit =3Dstd::scope_exit([&status,&modifier]()->void
> {
> LogStatus(status,"SomeFunction",modifier);
> });
> |
>
> vs:
>
> |
> scope(exit)
> {
> LogStatus(status,"SomeFunction",modifier);
> }
> |
>
> Isn't that so much better? No messy variables to create. No name=20
> collisions. No lambdas, and therefore no need to explicitly include=20
> anything in scope. It's immediately clear what it does.
>
> That way, you don't need to modify std::uncaught_exception or anything=20
> like that. The system will call the `scope(failure)` at the correct time.
>
>
Of course the language integrated feature is more succinct and readable,=20
but having an orthogonal design has also its advantages. BTW, I don't=20
master C++ lambdas, but could you example be written as
|
auto&&_ =3Dstd::scope_exit(
[](){
LogStatus(status,"SomeFunction",modifier);
});
|
?
I'm not a compiler writer, and I can not evaluate the cost of=20
introducing such a feature compared to the introduction of a updated=20
uncaught_exception. If the implementation on the language could provide=20
much better performances this could be a valid justification.
Note also that if you propose to have scoped(success) and=20
scoped(failure) this will introduces 4 new keywords. Some of them been=20
already used as functions and the others are quite current words.
On the other side, providing a simple mechanism to determine success or=20
failure has other applications. But maybe this merits a separated=20
proposal. Is anyone working already on a proposal addressing this feature?
Best,
Vicente
--=20
--------------050405030807040608040704
Content-Type: text/html; charset=ISO-8859-1
<html>
<head>
<meta content="text/html; charset=ISO-8859-1"
http-equiv="Content-Type">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<div class="moz-cite-prefix">Le 13/11/12 20:59, Nicol Bolas a
écrit :<br>
</div>
<blockquote
cite="mid:dbc197a6-c448-4ac3-ac10-256376c7fa32@isocpp.org"
type="cite"><br>
<br>
On Tuesday, November 13, 2012 11:30:53 AM UTC-8, viboes wrote:
<blockquote class="gmail_quote" style="margin: 0;margin-left:
0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;">
<div bgcolor="#FFFFFF" text="#000000">
<div>Le 13/11/12 08:48, Andrew Sandoval a écrit :<br>
</div>
<br>
<br>
The proposal could be complemented with scoped_success,
scoped_failure (based on D language). This could be possible
updating <code><span>std</span><span>::</span><span>uncaught_exception</span></code>
or any other mechanism so that failure or success conditions
can be determined.<br>
</div>
</blockquote>
<div bgcolor="#FFFFFF" text="#000000"><br>
That's the thing: if it's going to happen, I would much rather
it <i>be</i> a language feature. Just compare the code:<br>
<br>
<div class="prettyprint" style="background-color: rgb(250, 250,
250); border-color: rgb(187, 187, 187); border-style: solid;
border-width: 1px; word-wrap: break-word;"><code
class="prettyprint">
<div class="subprettyprint"><span style="color: #008;"
class="styled-by-prettify">auto</span><span
style="color: #000;" class="styled-by-prettify"> </span><span
style="color: #660;" class="styled-by-prettify">&&</span><span
style="color: #000;" class="styled-by-prettify">log_status_on_exit
</span><span style="color: #660;"
class="styled-by-prettify">=</span><span style="color:
#000;" class="styled-by-prettify"> std</span><span
style="color: #660;" class="styled-by-prettify">::</span><span
style="color: #000;" class="styled-by-prettify">scope_exit</span><span
style="color: #660;" class="styled-by-prettify">([&</span><span
style="color: #000;" class="styled-by-prettify">status</span><span
style="color: #660;" class="styled-by-prettify">,</span><span
style="color: #000;" class="styled-by-prettify"> </span><span
style="color: #660;" class="styled-by-prettify">&</span><span
style="color: #000;" class="styled-by-prettify">modifier</span><span
style="color: #660;" class="styled-by-prettify">]()</span><span
style="color: #000;" class="styled-by-prettify"> </span><span
style="color: #660;" class="styled-by-prettify">-></span><span
style="color: #008;" class="styled-by-prettify">void</span><span
style="color: #000;" class="styled-by-prettify"><br>
</span><span style="color: #660;"
class="styled-by-prettify">{</span><span style="color:
#000;" class="styled-by-prettify"><br>
</span><span style="color: #606;"
class="styled-by-prettify">LogStatus</span><span
style="color: #660;" class="styled-by-prettify">(</span><span
style="color: #000;" class="styled-by-prettify">status</span><span
style="color: #660;" class="styled-by-prettify">,</span><span
style="color: #000;" class="styled-by-prettify"> </span><span
style="color: #080;" class="styled-by-prettify">"SomeFunction"</span><span
style="color: #660;" class="styled-by-prettify">,</span><span
style="color: #000;" class="styled-by-prettify">
modifier</span><span style="color: #660;"
class="styled-by-prettify">);</span><span style="color:
#000;" class="styled-by-prettify"><br>
</span><span style="color: #660;"
class="styled-by-prettify">});</span><span style="color:
#000;" class="styled-by-prettify"><br>
</span></div>
</code></div>
<br>
vs:<br>
<br>
<div class="prettyprint" style="background-color: rgb(250, 250,
250); border-color: rgb(187, 187, 187); border-style: solid;
border-width: 1px; word-wrap: break-word;"><code
class="prettyprint">
<div class="subprettyprint"><span style="color: #000;"
class="styled-by-prettify">scope</span><span
style="color: #660;" class="styled-by-prettify">(</span><span
style="color: #008;" class="styled-by-prettify">exit</span><span
style="color: #660;" class="styled-by-prettify">)</span><span
style="color: #000;" class="styled-by-prettify"><br>
</span><span style="color: #660;"
class="styled-by-prettify">{</span><span style="color:
#000;" class="styled-by-prettify"><br>
</span><span style="color: #606;"
class="styled-by-prettify">LogStatus</span><span
style="color: #660;" class="styled-by-prettify">(</span><span
style="color: #000;" class="styled-by-prettify">status</span><span
style="color: #660;" class="styled-by-prettify">,</span><span
style="color: #000;" class="styled-by-prettify"> </span><span
style="color: #080;" class="styled-by-prettify">"SomeFunction"</span><span
style="color: #660;" class="styled-by-prettify">,</span><span
style="color: #000;" class="styled-by-prettify">
modifier</span><span style="color: #660;"
class="styled-by-prettify">);</span><span style="color:
#000;" class="styled-by-prettify"><br>
</span><span style="color: #660;"
class="styled-by-prettify">}</span><span style="color:
#000;" class="styled-by-prettify"><br>
</span></div>
</code></div>
<br>
Isn't that so much better? No messy variables to create. No name
collisions. No lambdas, and therefore no need to explicitly
include anything in scope. It's immediately clear what it does.<br>
<br>
That way, you don't need to modify std::uncaught_exception or
anything like that. The system will call the `scope(failure)` at
the correct time.<br>
</div>
<blockquote class="gmail_quote" style="margin: 0;margin-left:
0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;">
</blockquote>
<br>
</blockquote>
Of course the language integrated feature is more succinct and
readable, but having an orthogonal design has also its advantages.
BTW, I don't master C++ lambdas, but could you example be written as<br>
<br>
<div class="prettyprint" style="background-color: rgb(250, 250,
250); border-color: rgb(187, 187, 187); border-style: solid;
border-width: 1px; word-wrap: break-word;"><code
class="prettyprint">
<div class="subprettyprint"><span style="color: #008;"
class="styled-by-prettify">auto</span><span style="color:
#000;" class="styled-by-prettify"> </span><span
style="color: #660;" class="styled-by-prettify">&&</span><span
style="color: #000;" class="styled-by-prettify"> _ </span><span
style="color: #660;" class="styled-by-prettify">=</span><span
style="color: #000;" class="styled-by-prettify"> std</span><span
style="color: #660;" class="styled-by-prettify">::</span><span
style="color: #000;" class="styled-by-prettify">scope_exit</span><span
style="color: #660;" class="styled-by-prettify">(<br>
[</span><span style="color: #660;"
class="styled-by-prettify">]()</span><span style="color:
#000;" class="styled-by-prettify"> </span><span
style="color: #660;" class="styled-by-prettify">{</span><span
style="color: #000;" class="styled-by-prettify"><br>
</span><span style="color: #606;"
class="styled-by-prettify">LogStatus</span><span
style="color: #660;" class="styled-by-prettify">(</span><span
style="color: #000;" class="styled-by-prettify">status</span><span
style="color: #660;" class="styled-by-prettify">,</span><span
style="color: #000;" class="styled-by-prettify"> </span><span
style="color: #080;" class="styled-by-prettify">"SomeFunction"</span><span
style="color: #660;" class="styled-by-prettify">,</span><span
style="color: #000;" class="styled-by-prettify"> modifier</span><span
style="color: #660;" class="styled-by-prettify">);</span><span
style="color: #000;" class="styled-by-prettify"><br>
</span><span style="color: #660;" class="styled-by-prettify">});</span><span
style="color: #000;" class="styled-by-prettify"><br>
</span></div>
</code></div>
<br>
?<br>
<br>
I'm not a compiler writer, and I can not evaluate the cost of
introducing such a feature compared to the introduction of a updated
uncaught_exception. If the implementation on the language could
provide much better performances this could be a valid
justification. <br>
<br>
Note also that if you propose to have scoped(success) and
scoped(failure) this will introduces 4 new keywords. Some of them
been already used as functions and the others are quite current
words.<br>
<br>
On the other side, providing a simple mechanism to determine success
or failure has other applications. But maybe this merits a separated
proposal. Is anyone working already on a proposal addressing this
feature?<br>
<br>
Best,<br>
Vicente<br>
<br>
</body>
</html>
<p></p>
-- <br />
<br />
<br />
<br />
--------------050405030807040608040704--
.
Author: "Vicente J. Botet Escriba" <vicente.botet@wanadoo.fr>
Date: Tue, 13 Nov 2012 23:00:25 +0100
Raw View
This is a multi-part message in MIME format.
--------------010909040704030202000308
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: quoted-printable
Le 13/11/12 19:11, Nicol Bolas a =E9crit :
>
>
> On Tuesday, November 13, 2012 10:02:09 AM UTC-8, viboes wrote:
>
> Le 13/11/12 18:47, Nicol Bolas a =E9crit :
>>
>>
>>
>> I'm pretty sure he's talking about using RAII as the thing that
>> increments the loop counter. Like this:
>>
>> |
>> int*currValue =3D&someArray[0];
>> for(inti =3D0;i <size;++i)
>> {
>> scope(exit){++currValue;}//Every iteration will update the
>> current value.
>> //...
>> if(soemthing)
>> {
>> continue;
>> }
>>
>> //++currValue; //old way: skipped by the continue. By accident.
>> }
>> |
>>
>>
> Hi,
>
> The C solution to this problem is to put the scoped exit action on
> the for, isn't it?
>
> |
> int*currValue =3D&someArray[0];
> for(inti =3D0;i <size;++i,|++currValue|)
> {
> //...
> if(soemthing)
> {
> continue;
> }
> }
> |
>
>
>
>
> As I said, it would be used for more complex incrementing than=20
> something that could fit in a for-loop expression (or for non-for loops).
> --=20
>
You are surely right it could have a sense to use a scoped exit in this=20
context, but then the example should include a non-for loop and/or a=20
more complex increment or just remove it as it doesn't add nothing more.
Vicente
--=20
--------------010909040704030202000308
Content-Type: text/html; charset=ISO-8859-1
<html>
<head>
<meta content="text/html; charset=ISO-8859-1"
http-equiv="Content-Type">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<div class="moz-cite-prefix">Le 13/11/12 19:11, Nicol Bolas a
écrit :<br>
</div>
<blockquote
cite="mid:67f7a8cb-8ec3-4519-9d98-9abae28ab392@isocpp.org"
type="cite"><br>
<br>
On Tuesday, November 13, 2012 10:02:09 AM UTC-8, viboes wrote:
<blockquote class="gmail_quote" style="margin: 0;margin-left:
0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;">
<div bgcolor="#FFFFFF" text="#000000">
<div>Le 13/11/12 18:47, Nicol Bolas a écrit :<br>
</div>
<blockquote type="cite"><br>
<br>
<div><br>
I'm pretty sure he's talking about using RAII as the thing
that increments the loop counter. Like this:<br>
<br>
<div
style="background-color:rgb(250,250,250);border-color:rgb(187,187,187);border-style:solid;border-width:1px;word-wrap:break-word"><code>
<div><span style="color:#008">int</span><span
style="color:#000"> </span><span
style="color:#660">*</span><span
style="color:#000">currValue </span><span
style="color:#660">=</span><span
style="color:#000"> </span><span
style="color:#660">&</span><span
style="color:#000">someArray</span><span
style="color:#660">[</span><span
style="color:#066">0</span><span
style="color:#660">];</span><span
style="color:#000"><br>
</span><span style="color:#008">for</span><span
style="color:#660">(</span><span
style="color:#008">int</span><span
style="color:#000"> i </span><span
style="color:#660">=</span><span
style="color:#000"> </span><span
style="color:#066">0</span><span
style="color:#660">;</span><span
style="color:#000"> i </span><span
style="color:#660"><</span><span
style="color:#000"> size</span><span
style="color:#660">;</span><span
style="color:#000"> </span><span
style="color:#660">++</span><span
style="color:#000">i</span><span
style="color:#660">)</span><span
style="color:#000"><br>
</span><span style="color:#660">{</span><span
style="color:#000"><br>
scope</span><span style="color:#660">(</span><span
style="color:#008">exit</span><span
style="color:#660">)</span><span
style="color:#000"> </span><span
style="color:#660">{++</span><span
style="color:#000">currValue</span><span
style="color:#660">;}</span><span
style="color:#000"> </span><span
style="color:#800">//Every iteration will update
the current value.</span><span style="color:#000"><br>
</span><span style="color:#800">//...</span><span
style="color:#000"><br>
</span><span style="color:#008">if</span><span
style="color:#660">(</span><span
style="color:#000">soemthing</span><span
style="color:#660">)</span><span
style="color:#000"><br>
</span><span style="color:#660">{</span><span
style="color:#000"><br>
</span><span style="color:#008">continue</span><span
style="color:#660">;</span><span
style="color:#000"><br>
</span><span style="color:#660">}</span><span
style="color:#000"><br>
<br>
</span><span style="color:#800">//++currValue;
//old way: skipped by the continue. By accident.</span><span
style="color:#000"><br>
</span><span style="color:#660">}</span></div>
</code></div>
<br>
<br>
</div>
</blockquote>
Hi,<br>
<br>
The C solution to this problem is to put the scoped exit
action on the for, isn't it?<br>
<br>
<div
style="background-color:rgb(250,250,250);border-color:rgb(187,187,187);border-style:solid;border-width:1px;word-wrap:break-word"><code>
<div><span style="color:#008">int</span><span
style="color:#000"> </span><span style="color:#660">*</span><span
style="color:#000">currValue </span><span
style="color:#660">=</span><span style="color:#000"> </span><span
style="color:#660">&</span><span
style="color:#000">someArray</span><span
style="color:#660">[</span><span style="color:#066">0</span><span
style="color:#660">];</span><span style="color:#000"><br>
</span><span style="color:#008">for</span><span
style="color:#660">(</span><span style="color:#008">int</span><span
style="color:#000"> i </span><span style="color:#660">=</span><span
style="color:#000"> </span><span style="color:#066">0</span><span
style="color:#660">;</span><span style="color:#000"> i
</span><span style="color:#660"><</span><span
style="color:#000"> size</span><span
style="color:#660">;</span><span style="color:#000"> </span><span
style="color:#660">++</span><span style="color:#000">i</span><span
style="color:#660">,</span><span style="color:#660"><code><span
style="color:#660">++</span><span
style="color:#000">currValue</span><span
style="color:#660"></span></code>)</span><span
style="color:#000"><br>
</span><span style="color:#660">{</span><span
style="color:#000"><br>
</span><span style="color:#000"> </span><span
style="color:#800">//...</span><span
style="color:#000"><br>
</span><span style="color:#008">if</span><span
style="color:#660">(</span><span style="color:#000">soemthing</span><span
style="color:#660">)</span><span style="color:#000"><br>
</span><span style="color:#660">{</span><span
style="color:#000"><br>
</span><span style="color:#008">continue</span><span
style="color:#660">;</span><span style="color:#000"><br>
</span><span style="color:#660">}</span><span
style="color:#000"><br>
</span><span style="color:#660">}</span></div>
</code></div>
<br>
<br>
<br>
</div>
</blockquote>
<div><br>
As I said, it would be used for more complex incrementing than
something that could fit in a for-loop expression (or for
non-for loops). <br>
</div>
-- <br>
<br>
</blockquote>
You are surely right it could have a sense to use a scoped exit in
this context, but then the example should include a non-for loop
and/or a more complex increment or just remove it as it doesn't add
nothing more. <br>
<br>
Vicente<br>
<br>
</body>
</html>
<p></p>
-- <br />
<br />
<br />
<br />
--------------010909040704030202000308--
.
Author: Andrew Sandoval <sandoval@netwaysglobal.com>
Date: Tue, 13 Nov 2012 14:44:29 -0800 (PST)
Raw View
------=_Part_123_26236596.1352846669875
Content-Type: text/plain; charset=ISO-8859-1
On Tuesday, November 13, 2012 11:22:34 AM UTC-6, Ville Voutilainen wrote:
>
> On 13 November 2012 18:37, Andrew Sandoval <sand...@netwaysglobal.com<javascript:>>
> wrote:
> > Answers are inline below. Thanks Ville!
>
> As they should be, top-posting is brain-damaged. :)
>
> >> Should scoped_resource throw from its constructor if it gets a
> no-delete
> >> value?
> > No! The goal here is to replace code that does something like the
> following
> > at the bottom of every function (which often lead to goto being used to
> exit
> > on error):
> > ErrorExit:
> > if(resource != no_delete_value)
> > {
> > delete_resource(resource)
> > }
> > There may be arguments to be made for having a version of the classes
> that
> > does throw, but having to catch exceptions would alter the scope and
> > therefore the expected lifetime of the resource! IMO, using the
> .valid()
> > member is far superior than throwing.
>
> Lifetime of the resource? What resource? We just failed to acquire a
> resource.
> Consider vector.
>
> vector<int> f();
>
> vector<int> x(f());
>
> if the Acquisition of the Resource fails, Initialization fails as
> well. Using open(),
> if open() fails, we have no resource to operate on. Why are we
> continuing forward
> with the initialization, or the code beyond it? The response to an
> initialization failure
> in C++ is a throw. Now, for the handles that can't detect the failure,
> we can't do that,
> but for the handle that takes the "invalid" value as an argument, we
> can, and likely
> should.
>
> This is a good point. I'm looking at it from a different perspective,
which is that I'd also like to be able to use this in situations where
exceptions can't be handled, such as in Windows kernel drivers. If you
were to use a vector there, you would have to replace the default allocator
with one that pulled from the proper pool, and then you'd also have to
ensure it didn't throw. Every vector's constructor, resize, and push_back,
etc. would then have to be checked, using something like: if(vec.size() !=
requested_size)... Using STL in kernel drivers isn't common obviously, but
it is still better to have to do all of those checks than to not have STL
at all.
I think though that we can accomplish both objectives. It shouldn't be too
hard to add a non-type (bool) template parameter that enables throwing when
a no-delete value is assigned in the constructor, operator=, or reset.
Then the only thing that has to change is the generator (the make_function, which is currently
scope_exit()). In that way we can produce the throw and nothrow varieties
as needed. scoped_resource_t would have to have another non-type parameter
too (bool), but I think that would be okay. We might have to argue over
the default value for it though.
Does that seem like a reasonable compromise?
> > In my experience, every time an exception handler must be used, nesting
> and
> > complexity increase, and often unnecessarily.
>
> I have the completely opposite experience. I don't have to do nested
> checks
> with exceptions, and the complexity of code is less than without
> exceptions.
> I can decide where I put the complexity, and the no-error paths are fast
> and
> clean because there's no checking of return values all over the place.
> That's
> the reason people use RAII instead of return values or valid() checks.
>
> >> Should we have operator-> for accessing the underlying value?
> > I'm not opposed to that. I can add that if there is consensus. With
> the
> > get() method, and a cast operator it doesn't feel intuitive to use
> > operator-> to me, but I could be convinced.
>
> When I use a handle, I want to use it for all accesses to the
> underlying resource,
> so if I have to call a member function of the underlying resource, I
> expect to
> be able to do handle->func(), not handle.get().func() or, heaven forbid,
> Resource& res = handle; res.func(); or Resource& res = handle.get();
> res.func();
> Handles are, as often as possible, as transparent as possible. That
> would indicate
> that we want to have, for the purposes of type-deducing function
> templates,
> operator*(), and for things that want a pointer, operator&(), too.
>
I see your point there as well, and I can add operator* and operator&, and
operator->.
Thank you!
-Andrew Sandoval
--
------=_Part_123_26236596.1352846669875
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
On Tuesday, November 13, 2012 11:22:34 AM UTC-6, Ville Voutilainen wrote:<b=
lockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;borde=
r-left: 1px #ccc solid;padding-left: 1ex;">On 13 November 2012 18:37, Andre=
w Sandoval <<a href=3D"javascript:" target=3D"_blank" gdf-obfuscated-mai=
lto=3D"wDZqzPGu2soJ">sand...@netwaysglobal.com</a>> wrote:
<br>> Answers are inline below. Thanks Ville!
<br>
<br>As they should be, top-posting is brain-damaged. :)
<br>
<br>>> Should scoped_resource throw from its constructor if it gets a=
no-delete
<br>>> value?
<br>> No! The goal here is to replace code that does something lik=
e the following
<br>> at the bottom of every function (which often lead to goto being us=
ed to exit
<br>> on error):
<br>> ErrorExit:
<br>> if(resource !=3D no_delete_value)
<br>> {
<br>> delete_resource(resource)
<br>> }
<br>> There may be arguments to be made for having a version of the clas=
ses that
<br>> does throw, but having to catch exceptions would alter the scope a=
nd
<br>> therefore the expected lifetime of the resource! IMO, using =
the .valid()
<br>> member is far superior than throwing.
<br>
<br>Lifetime of the resource? What resource? We just failed to acquire a re=
source.
<br>Consider vector.
<br>
<br>vector<int> f();
<br>
<br>vector<int> x(f());
<br>
<br>if the Acquisition of the Resource fails, Initialization fails as
<br>well. Using open(),
<br>if open() fails, we have no resource to operate on. Why are we
<br>continuing forward
<br>with the initialization, or the code beyond it? The response to an
<br>initialization failure
<br>in C++ is a throw. Now, for the handles that can't detect the failure,
<br>we can't do that,
<br>but for the handle that takes the "invalid" value as an argument, we
<br>can, and likely
<br>should.
<br>
<br></blockquote><div>This is a good point. I'm looking at it from a =
different perspective, which is that I'd also like to be able to use this i=
n situations where exceptions can't be handled, such as in Windows kernel d=
rivers. If you were to use a vector there, you would have to replace =
the default allocator with one that pulled from the proper pool, and then y=
ou'd also have to ensure it didn't throw. Every vector's constructor,=
<span style=3D"font-family: courier new,monospace;">resize</span>, and <sp=
an style=3D"font-family: courier new,monospace;">push_back</span>, etc. wou=
ld then have to be checked, using something like:<span style=3D"font-family=
: courier new,monospace;"> if(vec.size() !=3D requested_size)...</span>&nbs=
p; Using STL in kernel drivers isn't common obviously, but it is still bett=
er to have to do all of those checks than to not have STL at all.<br><br>I =
think though that we can accomplish both objectives. It shouldn't be =
too hard to add a non-type (<span style=3D"font-family: courier new,monospa=
ce;">bool</span>) template parameter that enables throwing when a no-delete=
value is assigned in the constructor, <span style=3D"font-family: courier =
new,monospace;">operator=3D</span>, or <span style=3D"font-family: courier =
new,monospace;">reset</span>. Then the only thing that has to change =
is the generator (the <span style=3D"font-family: courier new,monospace;">m=
ake_</span> function, which is currently <span style=3D"font-family: courie=
r new,monospace;">scope_exit()</span>). In that way we can produce th=
e <span style=3D"font-family: courier new,monospace;">throw </span>and <spa=
n style=3D"font-family: courier new,monospace;">nothrow </span>varieties as=
needed. <span style=3D"font-family: courier new,monospace;">scoped_r=
esource_t</span> would have to have another non-type parameter too (<span s=
tyle=3D"font-family: courier new,monospace;">bool</span>), but I think that=
would be okay. We might have to argue over the default value for it =
though.<br><br>Does that seem like a reasonable compromise?<br> </div>=
<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;bor=
der-left: 1px #ccc solid;padding-left: 1ex;">> In my experience, every t=
ime an exception handler must be used, nesting and
<br>> complexity increase, and often unnecessarily.
<br>
<br>I have the completely opposite experience. I don't have to do nested ch=
ecks
<br>with exceptions, and the complexity of code is less than without except=
ions.
<br>I can decide where I put the complexity, and the no-error paths are fas=
t and
<br>clean because there's no checking of return values all over the place. =
That's
<br>the reason people use RAII instead of return values or valid() checks.
<br>
<br>>> Should we have operator-> for accessing the underlying valu=
e?
<br>> I'm not opposed to that. I can add that if there is consensu=
s. With the
<br>> get() method, and a cast operator it doesn't feel intuitive to use
<br>> operator-> to me, but I could be convinced.
<br>
<br>When I use a handle, I want to use it for all accesses to the
<br>underlying resource,
<br>so if I have to call a member function of the underlying resource, I ex=
pect to
<br>be able to do handle->func(), not handle.get().func() or, heaven for=
bid,
<br>Resource& res =3D handle; res.func(); or Resource& res =3D hand=
le.get(); res.func();
<br>Handles are, as often as possible, as transparent as possible. That
<br>would indicate
<br>that we want to have, for the purposes of type-deducing function templa=
tes,
<br>operator*(), and for things that want a pointer, operator&(), too.
<br></blockquote><div><br>I see your point there as well, and I can add <sp=
an style=3D"font-family: courier new,monospace;">operator*</span> and <span=
style=3D"font-family: courier new,monospace;">operator&</span>, and <s=
pan style=3D"font-family: courier new,monospace;">operator-></span>.<br>=
<br>Thank you!<br>-Andrew Sandoval <br></div>
<p></p>
-- <br />
<br />
<br />
<br />
------=_Part_123_26236596.1352846669875--
.
Author: Ville Voutilainen <ville.voutilainen@gmail.com>
Date: Wed, 14 Nov 2012 00:47:07 +0200
Raw View
On 14 November 2012 00:44, Andrew Sandoval <sandoval@netwaysglobal.com> wrote:
> I think though that we can accomplish both objectives. It shouldn't be too
> hard to add a non-type (bool) template parameter that enables throwing when
> a no-delete value is assigned in the constructor, operator=, or reset. Then
> the only thing that has to change is the generator (the make_ function,
> which is currently scope_exit()). In that way we can produce the throw and
> nothrow varieties as needed. scoped_resource_t would have to have another
> non-type parameter too (bool), but I think that would be okay. We might
> have to argue over the default value for it though.
> Does that seem like a reasonable compromise?
Sounds reasonable, yes.
> I see your point there as well, and I can add operator* and operator&, and
> operator->.
Excellent!
--
.
Author: Nevin Liber <nevin@eviloverlord.com>
Date: Tue, 13 Nov 2012 17:43:06 -0600
Raw View
--0015174c0bfc49a1d004ce68fd5c
Content-Type: text/plain; charset=ISO-8859-1
On 13 November 2012 11:26, Andrew Sandoval <sandoval@netwaysglobal.com>wrote:
>
> I'm very appreciative of the feedback from many others that have helped
> move this along. I will try to find ways to make the examples more
> convincing, and I appreciate your suggestion. Please however, if you are
> on the committee and intend to shoot this down no matter what, please make
> that clear. This is a very time consuming process, and I don't have any to
> waste.
>
I'm on the committee, and I don't plan on shooting this down. Heck, I
could have used it today...
Real world case: I added an element to a map. I then did a bunch of work,
and if any of that work fails (some times by return code; other times by
exceptions being thrown), I need to remove that element from the map. It
would have been nice to have a scoped_exit for this.
(Yes, there are other ways I could have arranged the code, but I need to
optimize it for the success case.)
--
Nevin ":-)" Liber <mailto:nevin@eviloverlord.com> (847) 691-1404
--
--0015174c0bfc49a1d004ce68fd5c
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
On 13 November 2012 11:26, Andrew Sandoval <span dir=3D"ltr"><<a href=3D=
"mailto:sandoval@netwaysglobal.com" target=3D"_blank">sandoval@netwaysgloba=
l.com</a>></span> wrote:<br><div class=3D"gmail_quote"><blockquote class=
=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padd=
ing-left:1ex">
<br><div>I'm very appreciative of the feedback from many others that ha=
ve helped move this along.=A0 I will try to find ways to make the examples =
more convincing, and I appreciate your suggestion.=A0 Please however, if yo=
u are on the committee and intend to shoot this down no matter what, please=
make that clear.=A0 This is a very time consuming process, and I don't=
have any to waste.<br>
</div></blockquote><div><br>I'm on the committee, and I don't plan =
on shooting this down.=A0 Heck, I could have used it today...<br><br>Real w=
orld case:=A0 I added an element to a map.=A0 I then did a bunch of work, a=
nd if any of that work fails (some times by return code; other times by exc=
eptions being thrown), I need to remove that element from the map.=A0 It wo=
uld have been nice to have a scoped_exit for this.<br>
<br>(Yes, there are other ways I could have arranged the code, but I need t=
o optimize it for the success case.)<br></div></div>-- <br>=A0Nevin ":=
-)" Liber=A0 <mailto:<a href=3D"mailto:nevin@eviloverlord.com" targ=
et=3D"_blank">nevin@eviloverlord.com</a>>=A0 (847) 691-1404<br>
<p></p>
-- <br />
<br />
<br />
<br />
--0015174c0bfc49a1d004ce68fd5c--
.
Author: Andrew Sandoval <sandoval@netwaysglobal.com>
Date: Tue, 13 Nov 2012 21:41:50 -0800 (PST)
Raw View
------=_Part_469_14572558.1352871710205
Content-Type: text/plain; charset=ISO-8859-1
On Tuesday, November 13, 2012 4:47:08 PM UTC-6, Ville Voutilainen wrote:
>
> On 14 November 2012 00:44, Andrew Sandoval <sand...@netwaysglobal.com<javascript:>>
> wrote:
> > I think though that we can accomplish both objectives. It shouldn't be
> too
> > hard to add a non-type (bool) template parameter that enables throwing
> when
> > a no-delete value is assigned in the constructor, operator=, or reset.
> Then
> > the only thing that has to change is the generator (the make_ function,
> > which is currently scope_exit()). In that way we can produce the throw
> and
> > nothrow varieties as needed. scoped_resource_t would have to have
> another
> > non-type parameter too (bool), but I think that would be okay. We might
> > have to argue over the default value for it though.
> > Does that seem like a reasonable compromise?
>
> Sounds reasonable, yes.
>
> > I see your point there as well, and I can add operator* and operator&,
> and
> > operator->.
>
> Excellent!
>
I'm in the process of reworking this. I've added the options for
throw/nothrow and the new operators. I'll post an update once I have
tested the reference implementation, and updated the proposal to match.
I've also changed some names, which I hope will make it less confusing. I
changed scoped_resource_uc to scoped_resource_unchecked.
I also changed scoped_resource_t to unique_resource, because it is in many
ways very similar to unique_ptr, but more importantly because it needs
distinction from scoped_function, scoped_resource_unchecked, and
scoped_resource. I couldn't think of a better way to express the idea that
it uses compile-time constants for the deleter function and the no-delete
value, where as scoped_resource_unchecked and scoped_resource do not.
That leads to another question... Does it makes sense to change the
generator (function template) for these from:
scoped_function<T> scope_exit(T t); to
scoped_function<T> *make_scoped_function*(T t);
and from:
scoped_resource_unchecked<T, R> scope_exit(R r, T t); to
scoped_resource_unchecked<T, R> *make_scoped_resource_unchecked*(R r, T t);
and from:
scoped_resource<T, R, true> scope_exit(R r, T t, R nd); to
scoped_resource<T, R, true> *make_scoped_resource*(R r, T t, R nd);
along with:
scoped_resource<T, R, false> scope_exit_nothrow(R r, T t, R nd); to
scoped_resource<T, R, false> *make_scoped_resource_nothrow*(R r, T t, R nd);
?
And if so, should the header remain <scope_exit>?
Thank you all for feedback on this!
-Andrew Sandoval
--
------=_Part_469_14572558.1352871710205
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
On Tuesday, November 13, 2012 4:47:08 PM UTC-6, Ville Voutilainen wrote:<bl=
ockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border=
-left: 1px #ccc solid;padding-left: 1ex;">On 14 November 2012 00:44, Andrew=
Sandoval <<a href=3D"javascript:" target=3D"_blank" gdf-obfuscated-mail=
to=3D"2ETzsLNTiCIJ">sand...@netwaysglobal.com</a>> wrote:
<br>> I think though that we can accomplish both objectives. It sh=
ouldn't be too
<br>> hard to add a non-type (bool) template parameter that enables thro=
wing when
<br>> a no-delete value is assigned in the constructor, operator=3D, or =
reset. Then
<br>> the only thing that has to change is the generator (the make_ func=
tion,
<br>> which is currently scope_exit()). In that way we can produce=
the throw and
<br>> nothrow varieties as needed. scoped_resource_t would have to=
have another
<br>> non-type parameter too (bool), but I think that would be okay. &nb=
sp;We might
<br>> have to argue over the default value for it though.
<br>> Does that seem like a reasonable compromise?
<br>
<br>Sounds reasonable, yes.
<br>
<br>> I see your point there as well, and I can add operator* and operat=
or&, and
<br>> operator->.
<br>
<br>Excellent!
<br></blockquote><div><br>I'm in the process of reworking this. I've =
added the options for throw/nothrow and the new operators. I'll post =
an update once I have tested the reference implementation, and updated the =
proposal to match.<br><br>I've also changed some names, which I hope will m=
ake it less confusing. I changed <span style=3D"font-family: courier =
new,monospace;">scoped_resource_uc</span> to <span style=3D"font-family: co=
urier new,monospace;">scoped_resource_unchecked</span>.<br><br>I also chang=
ed <span style=3D"font-family: courier new,monospace;">scoped_resource_t</s=
pan> to <span style=3D"font-family: courier new,monospace;">unique_resource=
</span>, because it is in many ways very similar to <span style=3D"font-fam=
ily: courier new,monospace;">unique_ptr</span>, but more importantly becaus=
e it needs distinction from <span style=3D"font-family: courier new,monospa=
ce;">scoped_function</span>, <span style=3D"font-family: courier new,monosp=
ace;">scoped_resource_unchecked</span>, and <span style=3D"font-family: cou=
rier new,monospace;">scoped_resource</span>. I couldn't think of a be=
tter way to express the idea that it uses compile-time constants for the de=
leter function and the no-delete value, where as <span style=3D"font-family=
: courier new,monospace;">scoped_resource_unchecked</span> and <span style=
=3D"font-family: courier new,monospace;">scoped_resource</span> do not.<br>=
<br>That leads to another question... Does it makes sense to change t=
he generator (function template) for these from:<br><span style=3D"font-fam=
ily: courier new,monospace;">scoped_function<T> scope_exit(T t);</spa=
n> to<br><span style=3D"font-family: courier new,monospace;">scoped_f=
unction<T> <b>make_scoped_function</b>(T t);</span><br>and from:<br><=
span style=3D"font-family: courier new,monospace;">scoped_resource_unchecke=
d<T, R> scope_exit(R r, T t);</span> to <span style=3D"fo=
nt-family: courier new,monospace;"><br>scoped_resource_unchecked<T, R>=
; <b>make_scoped_resource_unchecked</b>(R r, T t);</span><br>and from:<br><=
span style=3D"font-family: courier new,monospace;">scoped_resource<T, R,=
true> scope_exit(R r, T t, R nd);</span> to<br><span style=3D"fon=
t-family: courier new,monospace;">scoped_resource<T, R, true> <b>make=
_scoped_resource</b>(R r, T t, R nd);</span><br>along with:<br><span style=
=3D"font-family: courier new,monospace;">scoped_resource<T, R, false>=
scope_exit_nothrow(R r, T t, R nd);</span> to<br><span style=3D"font=
-family: courier new,monospace;">scoped_resource<T, R, false> <b>make=
_scoped_resource_nothrow</b>(R r, T t, R nd);</span><br>?<br><br>And if so,=
should the header remain <scope_exit>?<br><br>Thank you all for feed=
back on this!<br>-Andrew Sandoval<br></div>
<p></p>
-- <br />
<br />
<br />
<br />
------=_Part_469_14572558.1352871710205--
.
Author: Andrew Sandoval <sandoval@netwaysglobal.com>
Date: Fri, 16 Nov 2012 22:01:37 -0800 (PST)
Raw View
------=_Part_350_8501955.1353132097087
Content-Type: text/plain; charset=ISO-8859-1
On Tuesday, November 13, 2012 4:47:08 PM UTC-6, Ville Voutilainen wrote:
>
> On 14 November 2012 00:44, Andrew Sandoval <sand...@netwaysglobal.com<javascript:>>
> wrote:
> > I think though that we can accomplish both objectives. It shouldn't be
> too
> > hard to add a non-type (bool) template parameter that enables throwing
> when
> > a no-delete value is assigned in the constructor, operator=, or reset.
> Then
> > the only thing that has to change is the generator (the make_ function,
> > which is currently scope_exit()). In that way we can produce the throw
> and
> > nothrow varieties as needed. scoped_resource_t would have to have
> another
> > non-type parameter too (bool), but I think that would be okay. We might
> > have to argue over the default value for it though.
> > Does that seem like a reasonable compromise?
>
> Sounds reasonable, yes.
>
> > I see your point there as well, and I can add operator* and operator&,
> and
> > operator->.
>
> Excellent!
>
Okay, I've updated the reference implementation to include these operators
and the option of throwing exception on validity failure. I've also
changed all of the "generator" function templates to more closely follow
the standard, so we now have make_scoped_function(), andmake_scoped_resource().
I've updated draft of the proposal. It along with the links to the
reference implementation are still at
http://www.andrewlsandoval.com/scope_exit/.
I will soon begin trying to fill in the Technical Details. Prior to that
any additional feedback on the reference implementation or the proposal
text will be appreciated.
NOTE: The reference implementation requires std::remove_pointer and
std::add_reference for the operator*. When I tried compiling with g++
4.7.2 on Windows there were compiler errors related to these type_traits.
(Or maybe I just did something brain-dead.) I'll try to resolve that in
the morning, but if anyone has experience with the differences in
type_traits implementations and spots the problem before I do please let me
know. Otherwise thank you for being patient. It does compile fine with VS
2010.
Thanks Much,
Andrew Sandoval
--
------=_Part_350_8501955.1353132097087
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
On Tuesday, November 13, 2012 4:47:08 PM UTC-6, Ville Voutilainen wrote:<bl=
ockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border=
-left: 1px #ccc solid;padding-left: 1ex;">On 14 November 2012 00:44, Andrew=
Sandoval <<a href=3D"javascript:" target=3D"_blank" gdf-obfuscated-mail=
to=3D"2ETzsLNTiCIJ">sand...@netwaysglobal.com</a>> wrote:
<br>> I think though that we can accomplish both objectives. It sh=
ouldn't be too
<br>> hard to add a non-type (bool) template parameter that enables thro=
wing when
<br>> a no-delete value is assigned in the constructor, operator=3D, or =
reset. Then
<br>> the only thing that has to change is the generator (the make_ func=
tion,
<br>> which is currently scope_exit()). In that way we can produce=
the throw and
<br>> nothrow varieties as needed. scoped_resource_t would have to=
have another
<br>> non-type parameter too (bool), but I think that would be okay. &nb=
sp;We might
<br>> have to argue over the default value for it though.
<br>> Does that seem like a reasonable compromise?
<br>
<br>Sounds reasonable, yes.
<br>
<br>> I see your point there as well, and I can add operator* and operat=
or&, and
<br>> operator->.
<br>
<br>Excellent!
<br></blockquote><div><br>Okay, I've updated the reference implementation t=
o include these operators and the option of throwing exception on validity =
failure. I've also changed all of the "generator" function templates =
to more closely follow the standard, so we now have<span style=3D"font-fami=
ly: courier new,monospace;"> make_scoped_function()</span>, and<span style=
=3D"font-family: courier new,monospace;"> make_scoped_resource()</span>. <b=
r><br>I've updated draft of the proposal. It along with the links to =
the reference implementation are still at <a href=3D"http://www.andrewlsand=
oval.com/scope_exit/">http://www.andrewlsandoval.com/scope_exit/</a>.<br><b=
r>I will soon begin trying to fill in the Technical Details. Prior to=
that any additional feedback on the reference implementation or the propos=
al text will be appreciated.<br><br>NOTE: The reference implementation requ=
ires<span style=3D"font-family: courier new,monospace;"> std::remove_pointe=
r</span> and <span style=3D"font-family: courier new,monospace;">std::add_r=
eference</span> for the<span style=3D"font-family: courier new,monospace;">=
operator*</span>. When I tried compiling with g++ 4.7.2 on Windows t=
here were compiler errors related to these type_traits. (Or maybe I j=
ust did something brain-dead.) I'll try to resolve that in the mornin=
g, but if anyone has experience with the differences in type_traits impleme=
ntations and spots the problem before I do please let me know. Otherw=
ise thank you for being patient. It does compile fine with VS 2010.<b=
r><br>Thanks Much,<br>Andrew Sandoval<br></div>
<p></p>
-- <br />
<br />
<br />
<br />
------=_Part_350_8501955.1353132097087--
.
Author: "Vicente J. Botet Escriba" <vicente.botet@wanadoo.fr>
Date: Sat, 17 Nov 2012 10:20:39 +0100
Raw View
This is a multi-part message in MIME format.
--------------050003060507080906000909
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: quoted-printable
Le 17/11/12 07:01, Andrew Sandoval a =E9crit :
>
>
> Okay, I've updated the reference implementation to include these=20
> operators and the option of throwing exception on validity failure. =20
> I've also changed all of the "generator" function templates to more=20
> closely follow the standard, so we now havemake_scoped_function(),=20
> andmake_scoped_resource().
>
> I've updated draft of the proposal. It along with the links to the=20
> reference implementation are still at=20
> http://www.andrewlsandoval.com/scope_exit/.
>
Hi,
I have made some previous comments that had no answer. One of my=20
comments has already an answer, but not the others. Please, could you=20
replay to the feedback I give you on my previous post?
Thanks,
Vicente
--=20
--------------050003060507080906000909
Content-Type: text/html; charset=ISO-8859-1
<html>
<head>
<meta content="text/html; charset=ISO-8859-1"
http-equiv="Content-Type">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<div class="moz-cite-prefix">Le 17/11/12 07:01, Andrew Sandoval a
écrit :<br>
</div>
<blockquote
cite="mid:72d13339-4a9f-4714-9e7c-da4eb1c8832f@isocpp.org"
type="cite"><br>
<div><br>
Okay, I've updated the reference implementation to include these
operators and the option of throwing exception on validity
failure. I've also changed all of the "generator" function
templates to more closely follow the standard, so we now have<span
style="font-family: courier new,monospace;">
make_scoped_function()</span>, and<span style="font-family:
courier new,monospace;"> make_scoped_resource()</span>. <br>
<br>
I've updated draft of the proposal. It along with the links to
the reference implementation are still at <a
moz-do-not-send="true"
href="http://www.andrewlsandoval.com/scope_exit/">http://www.andrewlsandoval.com/scope_exit/</a>.<br>
<br>
</div>
</blockquote>
Hi,<br>
<br>
I have made some previous comments that had no answer. One of my
comments has already an answer, but not the others. Please, could
you replay to the feedback I give you on my previous post?<br>
<br>
Thanks,<br>
Vicente<br>
<br>
</body>
</html>
<p></p>
-- <br />
<br />
<br />
<br />
--------------050003060507080906000909--
.
Author: Andrew Sandoval <sandoval@netwaysglobal.com>
Date: Sat, 17 Nov 2012 08:11:36 -0800 (PST)
Raw View
------=_Part_130_12224195.1353168696420
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Answers inline...
On Tuesday, November 13, 2012 1:30:53 PM UTC-6, viboes wrote:
>
> Le 13/11/12 08:48, Andrew Sandoval a =E9crit :
> =20
> Hi,
>
> I don't think you need to add on your proposal the types returned by the=
=20
> scoped_exit function. Just propose a function that returns an=20
> implementation defined type that provides a specific behavior.
>
I'm open to the idea that the implementation details can be implementation=
=20
defined, but I don't see this example anywhere in the rest of the Standard=
=20
Library. The library defines types and make_... functions for them, but=20
doesn't just define make_... functions as far as I can tell.
I've made this easier in the updated reference implementation and proposal=
=20
by using names that clearly distinguish the types, and "generator" function=
=20
templates that use the make_... convention.
> I'm for the first overloading, which corresponds to the interface=20
> Boost.ScopedExit has to make code portable.
>
I'm sorry, I don't understand what you are saying there.=20
>
> The example motivating the second overload not convince me as we can use=
=20
> the simpler scoped_exit overload
>
> Instead of=20
> =20
> void drive_any_available_bus()
> {
> auto &&bus =3D std::scope_exit(lock_available_bus(), unlock_bus); =
// Always unlock the bus when done driving... No need to verify the resou=
rce first
> if(bus =3D=3D -1)
> {
> return; // No buses...
> }
> drive(bus);
> }
>
> the following should do the same
> =20
> void drive_any_available_bus()
> {
> if(lock_available_bus() =3D=3D -1) return;
>
> auto &&bus =3D std::scope_exit(unlock_bus);
>
> drive(bus); }
>
> Of course this will work, and this may be the best thing to do in certain=
=20
cases, but if you code defensively you will bind the resource allocation to=
=20
it's destruction, so that later on someone can't come in and add code that=
=20
could throw an exception (for example) in between your allocation and your=
=20
std::scope_exit() call.
=20
> The same applies to the third overload
>
> // Open a file, ensure it is closed when we leave scope, if the file des=
criptor is valid...
> auto&& iFileDesc =3D std::scope_exit(_open(pszPath, O_WRONLY), _close, -1=
); // if _open returns -1, don't call _close...
> if(iFileDesc.valid())
> {
> _write(iFileDesc, &data, sizeof(data));
> }
>
>
> could be replaced by
>
>
> auto fd =3D _open(pszPath, O_WRONLY);
>
> if (fd !=3D -1) return; // ...
>
> auto&& guard =3D std::scope_exit( [&fd] { _close(fd); } );
>
> _write(iFileDesc, &data, sizeof(data));
>
>
Again, the same answer. Code it defensively. Don't assume that because=20
this example is so simple it will never change. In real world code it is=
=20
very likely that there will be other things happening that could be moved=
=20
between your allocation (the call to _open) and the construction of guard. =
=20
And it is even more likely that there will be code prior to the _open that=
=20
does validation and constructs resources that will also need clean-up. By=
=20
using RAII wrappers throughout you have the liberty of using the quick-exit=
=20
returns throughout the function.
Also, why declare a second named variable (guard), that never gets=20
referenced? Bind the resource to its deleter-function and use it naturally=
=20
throughout the code, without thinking again about it's clean-up.
The last example concerns a resource wrapper with implicit conversion to=20
> the underlying resource. One of the problems with implicit conversions is=
=20
> that some overloads can be missed.=20
> When wrapping a resource an alternative approach is to provide the=20
> specific functions, in your case define a File wrapper, but there is no=
=20
> need for a generic scoped_resource to implement it.
>
> In particular the example could be implemented as
>
> class TestClassMember3
> {
> private:
> FILE m_hEvent;
> public:
> TestClassMember2() : m_hEvent(CreateEvent(nullptr, TRUE, FALSE, nullp=
tr))
> {
> }
>
> ~TestClassMember()=20
> {
> CloseHandle(m_hEvent);
> }=20
> // Other stuff here...
> };
>
> Again, in all of these examples you are breaking the tight coupling of th=
e=20
resource acquisition to its destruction. By using std::unique_resource or=
=20
std::scoped_resource as a class member variable, you ensure that=20
destruction of the resource occurs in the proper order (the reverse order=
=20
of initialization). You can eliminate the explicit destructor, which might=
=20
be written unintentionally to clean-up out-of-order.
The goal here is to get you to change your whole paradigm. If you plan and=
=20
declare the resource's lifetime when you initialize it or when you declare=
=20
it (as is the case with std::unique_resource), you need not worry about=20
remembering to put it in the destructor. It's easy to remember in a class=
=20
as simple as TestClassMember2, but in real world code there will be much=20
more to it, and the fact is that these things are forgotten all of the time=
..
std::unique_resource and std::scoped_resource also build in the validity=20
checking. You can either call .valid() or you can use the throw option to=
=20
throw failed_resource_initialization on construction of the wrapper.
=20
> Resuming the simple scoped_exit is enough to make a useful C++14 proposal=
=20
> that covers all the examples you have on your current proposal and could=
=20
> have good chances to be accepted.
> Of course this doesn't covers all the classes you wanted to propose, but=
=20
> ...
>
Again, I'm not following what you are trying to say here. I've read it a=
=20
couple of times and I must be missing something.
=20
>
> The proposal could be complemented with scoped_success, scoped_failure=20
> (based on D language). This could be possible updating std::
> uncaught_exception or any other mechanism so that failure or success=20
> conditions can be determined.
>
> That was added using the option to throw an exception on allocation / ini=
t=20
failure. It needs to be optional however to cover the broadest use cases,=
=20
such as environment where exceptions can't be tolerated.
=20
> Just my 2 euro cents,
> Vicente
>
> =20
Thanks Vicente. I hope I've answered your questions well.
-Andrew Sandoval=20
--=20
------=_Part_130_12224195.1353168696420
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Answers inline...<br><br>On Tuesday, November 13, 2012 1:30:53 PM UTC-6, vi=
boes wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left=
: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;">
=20
=20
=20
<div bgcolor=3D"#FFFFFF" text=3D"#000000">
<div>Le 13/11/12 08:48, Andrew Sandoval a
=E9crit :<br>
</div>
<br>
Hi,<br>
<br>
I don't think you need to add on your proposal the types returned by
the scoped_exit function. Just propose a function that returns an
implementation defined type that provides a specific behavior.<br></div=
></blockquote><div>I'm open to the idea that the implementation details can=
be implementation defined, but I don't see this example anywhere in the re=
st of the Standard Library. The library defines types and make_... fu=
nctions for them, but doesn't just define make_... functions as far as I ca=
n tell.<br><br>I've made this easier in the updated reference implementatio=
n and proposal by using names that clearly distinguish the types, and "gene=
rator" function templates that use the make_... convention.<br><br></div><b=
lockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;borde=
r-left: 1px #ccc solid;padding-left: 1ex;"><div bgcolor=3D"#FFFFFF" text=3D=
"#000000">
<br>
I'm for the first overloading, which corresponds to the interface
Boost.ScopedExit has to make code portable.<br></div></blockquote><div>=
I'm sorry, I don't understand what you are saying there. <br></div><blockqu=
ote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left=
: 1px #ccc solid;padding-left: 1ex;"><div bgcolor=3D"#FFFFFF" text=3D"#0000=
00">
<br>
The example motivating the second overload not convince me as we can
use the simpler scoped_exit overload<br>
<br>
Instead of <br>
=20
<code>
<pre>void drive_any_available_bus()
{
auto &&bus =3D std::scope_exit(lock_<wbr>available_bus(), unloc=
k_bus); // Always unlock the bus when done driving... No need to verif=
y the resource first
if(bus =3D=3D -1)
{
return; // No buses...
}
drive(bus);
}</pre>
</code>the following should do the same<br>
=20
<code>
<pre>void drive_any_available_bus()
{
if(lock_available_bus()<code></code> =3D=3D -1) return;
<code><pre> auto &&bus =3D std::scope_exit(unlock_bus);
</pre></code> drive(bus);
}</pre></code></div></blockquote><div>Of course this will work, and this ma=
y be the best thing to do in certain cases, but if you code defensively you=
will bind the resource allocation to it's destruction, so that later on so=
meone can't come in and add code that could throw an exception (for example=
) in between your allocation and your <span style=3D"font-family: courier n=
ew,monospace;">std::scope_exit()</span> call.<br> <br></div><blockquot=
e class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: =
1px #ccc solid;padding-left: 1ex;"><div bgcolor=3D"#FFFFFF" text=3D"#000000=
"><code><pre><code></code></pre>
</code>The same applies to the third overload<br>
<br>
=20
<code>
<pre>// Open a file, ensure it is closed when we leave scope, if the =
file descriptor is valid...
auto&& iFileDesc =3D std::scope_exit(_open(pszPath, O_WRONLY), _clo=
se, -1); // if _open returns -1, don't call _close...
if(iFileDesc.valid())
{
_write(iFileDesc, &data, sizeof(data));
}
</pre>
</code><code>
<pre>could be replaced by</pre>
</code><br>
<code>
<pre></pre>
</code>
<pre><code><code><pre><code><pre><code><pre><code><pre>auto fd =3D _ope=
n(pszPath, O_WRONLY);</pre></code></pre></code></pre></code>if (fd !=3D -1)=
return; // ...</pre></code></code></pre>
<code><code>
<pre>auto&& guard =3D std::scope_exit( [&fd] { _close(=
fd); } );</pre>
</code></code><code><code>
<pre>_write(iFileDesc, &data, sizeof(data));</pre></code></code=
></div></blockquote><div><br>Again, the same answer. Code it defensiv=
ely. Don't assume that because this example is so simple it will neve=
r change. In real world code it is very likely that there will be oth=
er things happening that could be moved between your allocation (the call t=
o<span style=3D"font-family: courier new,monospace;"> _open</span>) and the=
construction of <span style=3D"font-family: courier new,monospace;">guard<=
/span>. And it is even more likely that there will be code prior to t=
he <span style=3D"font-family: courier new,monospace;">_open</span> that do=
es validation and constructs resources that will also need clean-up. =
By using RAII wrappers throughout you have the liberty of using the quick-e=
xit <span style=3D"font-family: courier new,monospace;">return</span>s thro=
ughout the function.<br><br>Also, why declare a second named variable (<spa=
n style=3D"font-family: courier new,monospace;">guard</span>), that never g=
ets referenced? Bind the resource to its deleter-function and use it =
naturally throughout the code, without thinking again about it's clean-up.<=
br><br></div><blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-le=
ft: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div bgcolor=3D"#=
FFFFFF" text=3D"#000000"><code><code><pre></pre>
</code></code><code><code></code></code>The last example concerns
a resource wrapper with implicit conversion to the underlying
resource. One of the problems with implicit conversions is that some
overloads can be missed. <br>
When wrapping a resource an alternative approach is to provide the
specific functions, in your case define a File wrapper, but there is
no need for a generic scoped_resource to implement it.<br>
<br>
In particular the example could be implemented as<br>
<pre><code>class TestClassMember3
{
private:
FILE m_hEvent;
public:
TestClassMember2() : m_hEvent(CreateEvent(nullptr, TRUE, FALSE, nullptr=
))
{
}
~TestClassMember()=20
{
</code><code><code>CloseHandle</code>(</code><code><code>m_hEvent</=
code>);
}=20
// Other stuff here...
};</code></pre></div></blockquote><div>Again, in all of these examples you =
are breaking the tight coupling of the resource acquisition to its destruct=
ion. By using <span style=3D"font-family: courier new,monospace;">std=
::unique_resource </span>or <span style=3D"font-family: courier new,monospa=
ce;">std::scoped_resource</span> as a class member variable, you ensure tha=
t destruction of the resource occurs in the proper order (the reverse order=
of initialization). You can eliminate the explicit destructor, which=
might be written unintentionally to clean-up out-of-order.<br><br>The goal=
here is to get you to change your whole paradigm. If you plan and de=
clare the resource's lifetime when you initialize it or when you declare it=
(as is the case with <span style=3D"font-family: courier new,monospace;">s=
td::unique_resource</span>), you need not worry about remembering to put it=
in the destructor. It's easy to remember in a class as simple as <sp=
an style=3D"font-family: courier new,monospace;">TestClassMember2</span>, b=
ut in real world code there will be much more to it, and the fact is that t=
hese things are forgotten all of the time.<br><br><span style=3D"font-famil=
y: courier new,monospace;">std::unique_resource</span> and <span style=3D"f=
ont-family: courier new,monospace;">std::scoped_resource</span> also build =
in the validity checking. You can either call <span style=3D"font-fam=
ily: courier new,monospace;">.valid()</span> or you can use the throw optio=
n to throw <span style=3D"font-family: courier new,monospace;">failed_resou=
rce_initialization</span> on construction of the wrapper.<br> <br></di=
v><blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;b=
order-left: 1px #ccc solid;padding-left: 1ex;"><div bgcolor=3D"#FFFFFF" tex=
t=3D"#000000">
Resuming the simple scoped_exit is enough to make a useful C++14
proposal that covers all the examples you have on your current
proposal and could have good chances to be accepted.<br>
Of course this doesn't covers all the classes you wanted to propose,
but ...<br></div></blockquote><div>Again, I'm not following what you ar=
e trying to say here. I've read it a couple of times and I must be mi=
ssing something.<br> <br></div><blockquote class=3D"gmail_quote" style=
=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: =
1ex;"><div bgcolor=3D"#FFFFFF" text=3D"#000000">
<br>
The proposal could be complemented with scoped_success,
scoped_failure (based on D language). This could be possible
updating <code><span>std</span><span>::</span><span>uncaught_exception<=
/span></code>
or any other mechanism so that failure or success conditions can be
determined.<br>
<br></div></blockquote><div>That was added using the option to throw an=
exception on allocation / init failure. It needs to be optional howe=
ver to cover the broadest use cases, such as environment where exceptions c=
an't be tolerated.<br><br> <br></div><blockquote class=3D"gmail_quote"=
style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-=
left: 1ex;"><div bgcolor=3D"#FFFFFF" text=3D"#000000">
Just my 2 euro cents,<br>
Vicente<br>
<br></div></blockquote><div> </div><div>Thanks Vicente. I ho=
pe I've answered your questions well.<br>-Andrew Sandoval <br></div>
<p></p>
-- <br />
<br />
<br />
<br />
------=_Part_130_12224195.1353168696420--
.
Author: "Vicente J. Botet Escriba" <vicente.botet@wanadoo.fr>
Date: Sat, 17 Nov 2012 18:24:53 +0100
Raw View
This is a multi-part message in MIME format.
--------------030509020300030707060107
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: quoted-printable
Le 17/11/12 17:11, Andrew Sandoval a =E9crit :
> Answers inline...
>
> On Tuesday, November 13, 2012 1:30:53 PM UTC-6, viboes wrote:
>
> Le 13/11/12 08:48, Andrew Sandoval a =E9crit :
>
> Hi,
>
> I don't think you need to add on your proposal the types returned
> by the scoped_exit function. Just propose a function that returns
> an implementation defined type that provides a specific behavior.
>
> I'm open to the idea that the implementation details can be=20
> implementation defined, but I don't see this example anywhere in the=20
> rest of the Standard Library. The library defines types and make_...=20
> functions for them, but doesn't just define make_... functions as far=20
> as I can tell.
std::bind ?
>
> I've made this easier in the updated reference implementation and=20
> proposal by using names that clearly distinguish the types, and=20
> "generator" function templates that use the make_... convention.
>
>
> I'm for the first overloading, which corresponds to the interface
> Boost.ScopedExit has to make code portable.
>
> I'm sorry, I don't understand what you are saying there.
I meant the the first overload of make_scoped_exit, which now=20
corresponds to make_scoped_function.
>
>
> The example motivating the second overload not convince me as we
> can use the simpler scoped_exit overload
>
> Instead of
> |
>
> void drive_any_available_bus()
> {
> auto &&bus =3D std::scope_exit(lock_available_bus(), unlock_bus)=
; // Always unlock the bus when done driving... No need to verify the =
resource first
> if(bus =3D=3D -1)
> {
> return; // No buses...
> }
> drive(bus);
> }
>
> |the following should do the same
> |
>
> void drive_any_available_bus()
> {
> if(lock_available_bus()|| =3D=3D -1) return;
> |
>
> auto &&bus =3D std::scope_exit(unlock_bus);
> |
>
> drive(bus);
> }
>
> |
>
> Of course this will work, and this may be the best thing to do in=20
> certain cases, but if you code defensively you will bind the resource=20
> allocation to it's destruction, so that later on someone can't come in=20
> and add code that could throw an exception (for example) in between=20
> your allocation and your std::scope_exit() call.
I can understand the need for a wrapper that creates the resource on=20
construction and release them on destruction. I just think the generic=20
wrapper is not worth. At least your example should be much more explicit=20
and from the real world.
>
> |
>
> ||
>
> |The same applies to the third overload
>
> |
>
> // Open a file, ensure it is closed when we leave scope, if the file =
descriptor is valid...
> auto&& iFileDesc =3D std::scope_exit(_open(pszPath, O_WRONLY), _close=
, -1); // if _open returns -1, don't call _close...
> if(iFileDesc.valid())
> {
> _write(iFileDesc, &data, sizeof(data));
> }
>
> ||
>
> could be replaced by
>
> |
> ||
>
> ||
>
> |
>
> |
>
> |
>
> auto fd =3D _open(pszPath, O_WRONLY);|||
>
> if (fd !=3D -1) return; // ...||
>
> ||
>
> auto&& guard =3D std::scope_exit( [&fd] { _close(fd); } );
>
> ||||
>
> _write(iFileDesc, &data, sizeof(data));
>
> ||
>
>
> Again, the same answer. Code it defensively. Don't assume that=20
> because this example is so simple it will never change. In real world=20
> code it is very likely that there will be other things happening that=20
> could be moved between your allocation (the call to_open) and the=20
> construction of guard. And it is even more likely that there will be=20
> code prior to the _open that does validation and constructs resources=20
> that will also need clean-up. By using RAII wrappers throughout you=20
> have the liberty of using the quick-exit returns throughout the function.
What prevents the user of allocating the resource outside of the scoped=20
exit, as e.g. in
|
|
auto&& fd =3D _open(pszPath, O_WRONLY);
// do other things as throw an exception
|
auto&& iFileDesc =3D std::scope_exit(fd||||, _close, -1); =09
if(iFileDesc.valid())
{
_write(iFileDesc, &data, sizeof(data));
}
|
This is why I think that the wrapper must be specific
{
File f(pszPath, O_WRONLY||||);
// ...
} // close called on destruction
>
> Also, why declare a second named variable (guard), that never gets=20
> referenced? Bind the resource to its deleter-function and use it=20
> naturally throughout the code, without thinking again about it's clean-up=
..
I would like to see a way to using anonymous variables
||
auto&& ... =3D std::scope_exit( [&fd] { _close(fd); } );
or|| =20
auto&& auto =3D std::scope_exit( [&fd] { _close(fd); } );
But this is a minor issue any way.
||
||
>
> ||||||||The last example concerns a resource wrapper with implicit
> conversion to the underlying resource. One of the problems with
> implicit conversions is that some overloads can be missed.
> When wrapping a resource an alternative approach is to provide the
> specific functions, in your case define a File wrapper, but there
> is no need for a generic scoped_resource to implement it.
>
> In particular the example could be implemented as
>
> |class TestClassMember3
> {
> private:
> FILE m_hEvent;
> public:
> TestClassMember2() : m_hEvent(CreateEvent(nullptr, TRUE, FALSE, =
nullptr))
> {
> }
>
> ~TestClassMember()
> {
> |||CloseHandle|(|||m_hEvent|);
> }
> // Other stuff here...
> };|
>
> Again, in all of these examples you are breaking the tight coupling of=20
> the resource acquisition to its destruction.
Why? Here the class TestClassMemeber is playing the role of a specif=20
wrapper.
|
|
> By using std::unique_resource or std::scoped_resource as a class=20
> member variable, you ensure that destruction of the resource occurs in=20
> the proper order (the reverse order of initialization). You can=20
> eliminate the explicit destructor, which might be written=20
> unintentionally to clean-up out-of-order.
I understand that it is the role of the specific wrapper to release the=20
resource :)
>
> The goal here is to get you to change your whole paradigm. If you=20
> plan and declare the resource's lifetime when you initialize it or=20
> when you declare it (as is the case with std::unique_resource), you=20
> need not worry about remembering to put it in the destructor. It's=20
> easy to remember in a class as simple as TestClassMember2, but in real=20
> world code there will be much more to it, and the fact is that these=20
> things are forgotten all of the time.
I don't think the generic classes you are proposing make the user to=20
change to the best 'paradigm'. I really think the user needs specific=20
wrappers, not these kind of generic raii classes that let him the=20
responsibility to declare an auxiliary class to release the resource. A=20
specific C++ class depending on the domain must be defined to avoid the=20
user been working with non-safe resources. Well, this is just my opinion.
>
> std::unique_resource and std::scoped_resource also build in the=20
> validity checking. You can either call .valid() or you can use the=20
> throw option to throw failed_resource_initialization on construction=20
> of the wrapper.
>
> Resuming the simple scoped_exit is enough to make a useful C++14
> proposal that covers all the examples you have on your current
> proposal and could have good chances to be accepted.
> Of course this doesn't covers all the classes you wanted to
> propose, but ...
>
> Again, I'm not following what you are trying to say here. I've read it=20
> a couple of times and I must be missing something.
I meant that IMO only the fist overload is useful. The resource=20
abstractions are not. Proposing th scoped_exit function has a chance to=20
be accepted.
>
>
> The proposal could be complemented with scoped_success,
> scoped_failure (based on D language). This could be possible
> updating |std::uncaught_exception| or any other mechanism so that
> failure or success conditions can be determined.
>
> That was added using the option to throw an exception on allocation /=20
> init failure. It needs to be optional however to cover the broadest=20
> use cases, such as environment where exceptions can't be tolerated.
I think you have not understood my concern. What you have added lastly=20
has nothing to be with scoped(success) scoped(failure). See the D=20
language documentation.
>
> Thanks Vicente. I hope I've answered your questions well.
Now you did.
Vicente
--=20
--------------030509020300030707060107
Content-Type: text/html; charset=ISO-8859-1
<html>
<head>
<meta content="text/html; charset=ISO-8859-1"
http-equiv="Content-Type">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<div class="moz-cite-prefix">Le 17/11/12 17:11, Andrew Sandoval a
écrit :<br>
</div>
<blockquote
cite="mid:3b8c5c23-f8f5-4068-80a8-9be47fd48103@isocpp.org"
type="cite">Answers inline...<br>
<br>
On Tuesday, November 13, 2012 1:30:53 PM UTC-6, viboes wrote:
<blockquote class="gmail_quote" style="margin: 0;margin-left:
0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;">
<div bgcolor="#FFFFFF" text="#000000">
<div>Le 13/11/12 08:48, Andrew Sandoval a écrit :<br>
</div>
<br>
Hi,<br>
<br>
I don't think you need to add on your proposal the types
returned by the scoped_exit function. Just propose a function
that returns an implementation defined type that provides a
specific behavior.<br>
</div>
</blockquote>
<div>I'm open to the idea that the implementation details can be
implementation defined, but I don't see this example anywhere in
the rest of the Standard Library. The library defines types and
make_... functions for them, but doesn't just define make_...
functions as far as I can tell.<br>
</div>
</blockquote>
std::bind ?<br>
<blockquote
cite="mid:3b8c5c23-f8f5-4068-80a8-9be47fd48103@isocpp.org"
type="cite">
<div><br>
I've made this easier in the updated reference implementation
and proposal by using names that clearly distinguish the types,
and "generator" function templates that use the make_...
convention.<br>
<br>
</div>
<blockquote class="gmail_quote" style="margin: 0;margin-left:
0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;">
<div bgcolor="#FFFFFF" text="#000000"> <br>
I'm for the first overloading, which corresponds to the
interface Boost.ScopedExit has to make code portable.<br>
</div>
</blockquote>
<div>I'm sorry, I don't understand what you are saying there. <br>
</div>
</blockquote>
I meant the the first overload of make_scoped_exit, which now
corresponds to make_scoped_function. <br>
<blockquote
cite="mid:3b8c5c23-f8f5-4068-80a8-9be47fd48103@isocpp.org"
type="cite">
<blockquote class="gmail_quote" style="margin: 0;margin-left:
0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;">
<div bgcolor="#FFFFFF" text="#000000"> <br>
The example motivating the second overload not convince me as
we can use the simpler scoped_exit overload<br>
<br>
Instead of <br>
<code>
<pre>void drive_any_available_bus()
{
auto &&bus = std::scope_exit(lock_<wbr>available_bus(), unlock_bus); // Always unlock the bus when done driving... No need to verify the resource first
if(bus == -1)
{
return; // No buses...
}
drive(bus);
}</pre>
</code>the following should do the same<br>
<code>
<pre>void drive_any_available_bus()
{
if(lock_available_bus()<code></code> == -1) return;
<code><pre> auto &&bus = std::scope_exit(unlock_bus);
</pre></code> drive(bus);
}</pre>
</code></div>
</blockquote>
<div>Of course this will work, and this may be the best thing to
do in certain cases, but if you code defensively you will bind
the resource allocation to it's destruction, so that later on
someone can't come in and add code that could throw an exception
(for example) in between your allocation and your <span
style="font-family: courier new,monospace;">std::scope_exit()</span>
call.<br>
</div>
</blockquote>
I can understand the need for a wrapper that creates the resource on
construction and release them on destruction. I just think the
generic wrapper is not worth. At least your example should be much
more explicit and from the real world.<br>
<blockquote
cite="mid:3b8c5c23-f8f5-4068-80a8-9be47fd48103@isocpp.org"
type="cite">
<div> <br>
</div>
<blockquote class="gmail_quote" style="margin: 0;margin-left:
0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;">
<div bgcolor="#FFFFFF" text="#000000"><code>
<pre><code></code></pre>
</code>The same applies to the third overload<br>
<br>
<code>
<pre>// Open a file, ensure it is closed when we leave scope, if the file descriptor is valid...
auto&& iFileDesc = std::scope_exit(_open(pszPath, O_WRONLY), _close, -1); // if _open returns -1, don't call _close...
if(iFileDesc.valid())
{
_write(iFileDesc, &data, sizeof(data));
}
</pre>
</code><code>
<pre>could be replaced by</pre>
</code><br>
<code> </code>
<pre><code><code><pre><code><pre><code><pre><code><pre>auto fd = _open(pszPath, O_WRONLY);</pre></code></pre></code></pre></code>if (fd != -1) return; // ...</pre></code></code></pre>
<code><code>
<pre>auto&& guard = std::scope_exit( [&fd] { _close(fd); } );</pre>
</code></code><code><code>
<pre>_write(iFileDesc, &data, sizeof(data));</pre>
</code></code></div>
</blockquote>
<div><br>
Again, the same answer. Code it defensively. Don't assume that
because this example is so simple it will never change. In real
world code it is very likely that there will be other things
happening that could be moved between your allocation (the call
to<span style="font-family: courier new,monospace;"> _open</span>)
and the construction of <span style="font-family: courier
new,monospace;">guard</span>. And it is even more likely that
there will be code prior to the <span style="font-family:
courier new,monospace;">_open</span> that does validation and
constructs resources that will also need clean-up. By using
RAII wrappers throughout you have the liberty of using the
quick-exit <span style="font-family: courier new,monospace;">return</span>s
throughout the function.<br>
</div>
</blockquote>
<br>
What prevents the user of allocating the resource outside of the
scoped exit, as e.g. in<br>
<br>
<code>
<pre><code><pre>auto&& fd = _open(pszPath, O_WRONLY);
// do other things as throw an exception
</pre></code>auto&& iFileDesc = std::scope_exit(fd<code></code><code></code>, _close, -1);
if(iFileDesc.valid())
{
_write(iFileDesc, &data, sizeof(data));
}</pre>
</code><br>
This is why I think that the wrapper must be specific<br>
<br>
{<br>
File f(pszPath, O_WRONLY<code></code><code></code>);<br>
// ...<br>
} // close called on destruction<br>
<br>
<br>
<blockquote
cite="mid:3b8c5c23-f8f5-4068-80a8-9be47fd48103@isocpp.org"
type="cite">
<div><br>
Also, why declare a second named variable (<span
style="font-family: courier new,monospace;">guard</span>),
that never gets referenced? Bind the resource to its
deleter-function and use it naturally throughout the code,
without thinking again about it's clean-up.<br>
</div>
</blockquote>
I would like to see a way to using anonymous variables<br>
<br>
<code><code>
<pre>auto&& ... = std::scope_exit( [&fd] { _close(fd); } );
or<code><code> <pre>auto&& auto = std::scope_exit( [&fd] { _close(fd); } );</pre>
But this is a minor issue any way.
</code></code>
</pre>
</code></code>
<blockquote
cite="mid:3b8c5c23-f8f5-4068-80a8-9be47fd48103@isocpp.org"
type="cite">
<div><br>
</div>
<blockquote class="gmail_quote" style="margin: 0;margin-left:
0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;">
<div bgcolor="#FFFFFF" text="#000000"><code><code> </code></code><code><code></code></code>The
last example concerns a resource wrapper with implicit
conversion to the underlying resource. One of the problems
with implicit conversions is that some overloads can be
missed. <br>
When wrapping a resource an alternative approach is to provide
the specific functions, in your case define a File wrapper,
but there is no need for a generic scoped_resource to
implement it.<br>
<br>
In particular the example could be implemented as<br>
<pre><code>class TestClassMember3
{
private:
FILE m_hEvent;
public:
TestClassMember2() : m_hEvent(CreateEvent(nullptr, TRUE, FALSE, nullptr))
{
}
~TestClassMember()
{
</code><code><code>CloseHandle</code>(</code><code><code>m_hEvent</code>);
}
// Other stuff here...
};</code></pre>
</div>
</blockquote>
<div>Again, in all of these examples you are breaking the tight
coupling of the resource acquisition to its destruction. </div>
</blockquote>
Why? Here the class TestClassMemeber is playing the role of a specif
wrapper.<br>
<pre><code>
</code></pre>
<blockquote
cite="mid:3b8c5c23-f8f5-4068-80a8-9be47fd48103@isocpp.org"
type="cite">
<div>By using <span style="font-family: courier new,monospace;">std::unique_resource
</span>or <span style="font-family: courier new,monospace;">std::scoped_resource</span>
as a class member variable, you ensure that destruction of the
resource occurs in the proper order (the reverse order of
initialization). You can eliminate the explicit destructor,
which might be written unintentionally to clean-up out-of-order.<br>
</div>
</blockquote>
I understand that it is the role of the specific wrapper to release
the resource :)<br>
<blockquote
cite="mid:3b8c5c23-f8f5-4068-80a8-9be47fd48103@isocpp.org"
type="cite">
<div><br>
The goal here is to get you to change your whole paradigm. If
you plan and declare the resource's lifetime when you initialize
it or when you declare it (as is the case with <span
style="font-family: courier new,monospace;">std::unique_resource</span>),
you need not worry about remembering to put it in the
destructor. It's easy to remember in a class as simple as <span
style="font-family: courier new,monospace;">TestClassMember2</span>,
but in real world code there will be much more to it, and the
fact is that these things are forgotten all of the time.<br>
</div>
</blockquote>
I don't think the generic classes you are proposing make the user to
change to the best 'paradigm'. I really think the user needs
specific wrappers, not these kind of generic raii classes that let
him the responsibility to declare an auxiliary class to release the
resource. A specific C++ class depending on the domain must be
defined to avoid the user been working with non-safe resources.
Well, this is just my opinion. <br>
<blockquote
cite="mid:3b8c5c23-f8f5-4068-80a8-9be47fd48103@isocpp.org"
type="cite">
<div><br>
<span style="font-family: courier new,monospace;">std::unique_resource</span>
and <span style="font-family: courier new,monospace;">std::scoped_resource</span>
also build in the validity checking. You can either call <span
style="font-family: courier new,monospace;">.valid()</span> or
you can use the throw option to throw <span style="font-family:
courier new,monospace;">failed_resource_initialization</span>
on construction of the wrapper.<br>
<br>
</div>
<blockquote class="gmail_quote" style="margin: 0;margin-left:
0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;">
<div bgcolor="#FFFFFF" text="#000000"> Resuming the simple
scoped_exit is enough to make a useful C++14 proposal that
covers all the examples you have on your current proposal and
could have good chances to be accepted.<br>
Of course this doesn't covers all the classes you wanted to
propose, but ...<br>
</div>
</blockquote>
<div>Again, I'm not following what you are trying to say here.
I've read it a couple of times and I must be missing something.<br>
</div>
</blockquote>
I meant that IMO only the fist overload is useful. The resource
abstractions are not. Proposing th scoped_exit function has a chance
to be accepted.<br>
<blockquote
cite="mid:3b8c5c23-f8f5-4068-80a8-9be47fd48103@isocpp.org"
type="cite">
<div> <br>
</div>
<blockquote class="gmail_quote" style="margin: 0;margin-left:
0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;">
<div bgcolor="#FFFFFF" text="#000000"> <br>
The proposal could be complemented with scoped_success,
scoped_failure (based on D language). This could be possible
updating <code><span>std</span><span>::</span><span>uncaught_exception</span></code>
or any other mechanism so that failure or success conditions
can be determined.<br>
<br>
</div>
</blockquote>
<div>That was added using the option to throw an exception on
allocation / init failure. It needs to be optional however to
cover the broadest use cases, such as environment where
exceptions can't be tolerated.<br>
</div>
</blockquote>
I think you have not understood my concern. What you have added
lastly has nothing to be with scoped(success) scoped(failure). See
the D language documentation.<br>
<blockquote
cite="mid:3b8c5c23-f8f5-4068-80a8-9be47fd48103@isocpp.org"
type="cite">
<div> <br>
</div>
<div>Thanks Vicente. I hope I've answered your questions well.</div>
</blockquote>
Now you did.<br>
Vicente<br>
</body>
</html>
<p></p>
-- <br />
<br />
<br />
<br />
--------------030509020300030707060107--
.
Author: Andrew Sandoval <sandoval@netwaysglobal.com>
Date: Sat, 17 Nov 2012 13:30:42 -0800 (PST)
Raw View
------=_Part_367_18932490.1353187843350
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
On Saturday, November 17, 2012 11:24:56 AM UTC-6, viboes wrote:
>
> Le 17/11/12 17:11, Andrew Sandoval a =E9crit :
> =20
> Answers inline...
>
> On Tuesday, November 13, 2012 1:30:53 PM UTC-6, viboes wrote:=20
>>
>> Le 13/11/12 08:48, Andrew Sandoval a =E9crit :
>> =20
>> Hi,
>>
>> I don't think you need to add on your proposal the types returned by the=
=20
>> scoped_exit function. Just propose a function that returns an=20
>> implementation defined type that provides a specific behavior.
>> =20
> I'm open to the idea that the implementation details can be implementatio=
n=20
> defined, but I don't see this example anywhere in the rest of the Standar=
d=20
> Library. The library defines types and make_... functions for them, but=
=20
> doesn't just define make_... functions as far as I can tell.
> =20
> std::bind ?
>
True enough, and if the committee, or if others feel strongly that this=20
approach is better I am willing -- I don't mind it at all. However, it=20
only works for scoped_function, scoped_resource_unchecked and=20
scoped_resource. I don't see any way that it can work for the much=20
tighter, and IMO generally more useful unique_resource.=20
> =20
> I've made this easier in the updated reference implementation and proposa=
l=20
> by using names that clearly distinguish the types, and "generator" functi=
on=20
> templates that use the make_... convention.
>
> =20
>> I'm for the first overloading, which corresponds to the interface=20
>> Boost.ScopedExit has to make code portable.
>> =20
> I'm sorry, I don't understand what you are saying there.=20
> =20
> I meant the the first overload of make_scoped_exit, which now corresponds=
=20
> to make_scoped_function.=20
>
Okay... Your statement makes more sense now. I had to slow down and=20
insert commas before I understood what you were saying. Thanks for=20
clarifying.=20
> =20
>> The example motivating the second overload not convince me as we can use=
=20
>> the simpler scoped_exit overload
>>
>> Instead of=20
>> =20
>> void drive_any_available_bus()
>> {
>> auto &&bus =3D std::scope_exit(lock_available_bus(), unlock_bus); =
// Always unlock the bus when done driving... No need to verify the reso=
urce first
>> if(bus =3D=3D -1)
>> {
>> return; // No buses...
>> }
>> drive(bus);
>> }
>>
>> the following should do the same
>> =20
>> void drive_any_available_bus()
>> {
>> if(lock_available_bus() =3D=3D -1) return;
>>
>> auto &&bus =3D std::scope_exit(unlock_bus);
>>
>> drive(bus); }
>>
>> Of course this will work, and this may be the best thing to do in=20
> certain cases, but if you code defensively you will bind the resource=20
> allocation to it's destruction, so that later on someone can't come in an=
d=20
> add code that could throw an exception (for example) in between your=20
> allocation and your std::scope_exit() call.
> =20
> I can understand the need for a wrapper that creates the resource on=20
> construction and release them on destruction. I just think the generic=20
> wrapper is not worth. At least your example should be much more explicit=
=20
> and from the real world.
>
Thanks, I will work on a better, more real-world example. =20
> =20
> =20
>> The same applies to the third overload
>>
>> // Open a file, ensure it is closed when we leave scope, if the file de=
scriptor is valid...
>> auto&& iFileDesc =3D std::scope_exit(_open(pszPath, O_WRONLY), _close, -=
1); // if _open returns -1, don't call _close...
>> if(iFileDesc.valid())
>> {
>> _write(iFileDesc, &data, sizeof(data));
>> }
>>
>>
>> could be replaced by
>>
>>
>> auto fd =3D _open(pszPath, O_WRONLY);
>>
>> if (fd !=3D -1) return; // ...
>>
>> auto&& guard =3D std::scope_exit( [&fd] { _close(fd); } );
>>
>> _write(iFileDesc, &data, sizeof(data));
>>
>> =20
> Again, the same answer. Code it defensively. Don't assume that because=
=20
> this example is so simple it will never change. In real world code it is=
=20
> very likely that there will be other things happening that could be moved=
=20
> between your allocation (the call to _open) and the construction of guard=
.. =20
> And it is even more likely that there will be code prior to the _openthat=
does validation and constructs resources that will also need=20
> clean-up. By using RAII wrappers throughout you have the liberty of usin=
g=20
> the quick-exit returns throughout the function.
> =20
>
> What prevents the user of allocating the resource outside of the scoped=
=20
> exit, as e.g. in
>
> auto&& fd =3D _open(pszPath, O_WRONLY);
>
> // do other things as throw an exception
>
> auto&& iFileDesc =3D std::scope_exit(fd, _close, -1); if(iFileDesc.valid(=
))=20
> { _write(iFileDesc, &data, sizeof(data)); }
>
>
Nothing does. But then nothing stops you from doing this either:
SomeClass *pInstance =3D new SomeClass();
..
// Do stuff with pInstance
..
..
std::unique_ptr<SomeClass> pSomeClass(pInstance);
And yet we still have std::unique_ptr, etc.=20
>
> This is why I think that the wrapper must be specific
>
> {
> File f(pszPath, O_WRONLY);
> // ...
> } // close called on destruction
>
>
> I don't think we are going to agree on that. I would still do my File=20
class like this:
class File
{
private:
std::unique_resource<UNIQUE_DELETER(close), -1> m_iFd;
public:
File(const char *pszPath, int oflags, int iCreateFlags) : m_iFd(open(
pszPath, oflags, iCreateFlags))
{
}
.
.
.
};=20
Because again, I don't need an explicit destructor, I guarantee the proper=
=20
order of destruction, etc.
> =20
> Also, why declare a second named variable (guard), that never gets=20
> referenced? Bind the resource to its deleter-function and use it natural=
ly=20
> throughout the code, without thinking again about it's clean-up.
> =20
> I would like to see a way to using anonymous variables
>
> auto&& ... =3D std::scope_exit( [&fd] { _close(fd); } );
>
> or =20
>
> auto&& auto =3D std::scope_exit( [&fd] { _close(fd); } );
>
> But this is a minor issue any way.=20
>
> That is a different battle / proposal. I'm not opposed to it, but it has=
=20
to be fought on its own.=20
> =20
> The last example concerns a resource wrapper with implicit conversion=
=20
>> to the underlying resource. One of the problems with implicit conversion=
s=20
>> is that some overloads can be missed.=20
>> When wrapping a resource an alternative approach is to provide the=20
>> specific functions, in your case define a File wrapper, but there is no=
=20
>> need for a generic scoped_resource to implement it.
>>
>> In particular the example could be implemented as
>>
>> class TestClassMember3
>> {
>> private:
>> FILE m_hEvent;
>> public:
>> TestClassMember2() : m_hEvent(CreateEvent(nullptr, TRUE, FALSE, null=
ptr))
>> {
>> }
>>
>> ~TestClassMember()=20
>> {
>> CloseHandle(m_hEvent);
>> }=20
>> // Other stuff here...
>> };
>>
>> Again, in all of these examples you are breaking the tight coupling of=
=20
> the resource acquisition to its destruction. =20
>
> Why? Here the class TestClassMemeber is playing the role of a specif=20
> wrapper.
>
=20
Because in reality it will probably do more than that. And even if it does=
=20
not, by File example has less risk of someone screwing it up.=20
> By using std::unique_resource or std::scoped_resource as a class member=
=20
> variable, you ensure that destruction of the resource occurs in the prope=
r=20
> order (the reverse order of initialization). You can eliminate the=20
> explicit destructor, which might be written unintentionally to clean-up=
=20
> out-of-order.
> =20
> I understand that it is the role of the specific wrapper to release the=
=20
> resource :)
>
>
> The goal here is to get you to change your whole paradigm. If you plan=
=20
> and declare the resource's lifetime when you initialize it or when you=20
> declare it (as is the case with std::unique_resource), you need not worry=
=20
> about remembering to put it in the destructor. It's easy to remember in =
a=20
> class as simple as TestClassMember2, but in real world code there will be=
=20
> much more to it, and the fact is that these things are forgotten all of t=
he=20
> time.
> =20
> I don't think the generic classes you are proposing make the user to=20
> change to the best 'paradigm'. I really think the user needs specific=20
> wrappers, not these kind of generic raii classes that let him the=20
> responsibility to declare an auxiliary class to release the resource. A=
=20
> specific C++ class depending on the domain must be defined to avoid the=
=20
> user been working with non-safe resources. Well, this is just my opinion.=
=20
>
Agreed, that is your opinion and you are entitled to it. I just have to=20
ask, were you equal opposed to std::unique_ptr and std::shared_ptr, because=
=20
class could've been written with destructors that clean-up pointer too...?=
=20
> =20
> std::unique_resource and std::scoped_resource also build in the validity=
=20
> checking. You can either call .valid() or you can use the throw option=
=20
> to throw failed_resource_initialization on construction of the wrapper.
> =20
> =20
>> Resuming the simple scoped_exit is enough to make a useful C++14=20
>> proposal that covers all the examples you have on your current proposal =
and=20
>> could have good chances to be accepted.
>> Of course this doesn't covers all the classes you wanted to propose, but=
=20
>> ...
>> =20
> Again, I'm not following what you are trying to say here. I've read it a=
=20
> couple of times and I must be missing something.
> =20
> I meant that IMO only the fist overload is useful. The resource=20
> abstractions are not. Proposing th scoped_exit function has a chance to b=
e=20
> accepted.
>
Okay, thanks. If the rest has no chance, I'm not hearing that from others.=
=20
> =20
> =20
>> =20
>> The proposal could be complemented with scoped_success, scoped_failure=
=20
>> (based on D language). This could be possible updating std::
>> uncaught_exception or any other mechanism so that failure or success=20
>> conditions can be determined.
>>
>> That was added using the option to throw an exception on allocation /=
=20
> init failure. It needs to be optional however to cover the broadest use=
=20
> cases, such as environment where exceptions can't be tolerated.
> =20
> I think you have not understood my concern. What you have added lastly ha=
s=20
> nothing to be with scoped(success) scoped(failure). See the D language=20
> documentation.
>
Okay, too many languages in my head to have to worry about D too.=20
> =20
> Thanks Vicente. I hope I've answered your questions well.
>
> Now you did.
> Vicente
>
Thanks,
Andrew Sandoval=20
--=20
------=_Part_367_18932490.1353187843350
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
On Saturday, November 17, 2012 11:24:56 AM UTC-6, viboes wrote:<blockquote =
class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1p=
x #ccc solid;padding-left: 1ex;">
=20
=20
=20
<div bgcolor=3D"#FFFFFF" text=3D"#000000">
<div>Le 17/11/12 17:11, Andrew Sandoval a
=E9crit :<br>
</div>
<blockquote type=3D"cite">Answers inline...<br>
<br>
On Tuesday, November 13, 2012 1:30:53 PM UTC-6, viboes wrote:
<blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex=
;border-left:1px #ccc solid;padding-left:1ex">
<div bgcolor=3D"#FFFFFF" text=3D"#000000">
<div>Le 13/11/12 08:48, Andrew Sandoval a =E9crit :<br>
</div>
<br>
Hi,<br>
<br>
I don't think you need to add on your proposal the types
returned by the scoped_exit function. Just propose a function
that returns an implementation defined type that provides a
specific behavior.<br>
</div>
</blockquote>
<div>I'm open to the idea that the implementation details can be
implementation defined, but I don't see this example anywhere in
the rest of the Standard Library. The library defines types a=
nd
make_... functions for them, but doesn't just define make_...
functions as far as I can tell.<br>
</div>
</blockquote>
std::bind ?<br></div></blockquote><div>True enough, and if the committe=
e, or if others feel strongly that this approach is better I am willing -- =
I don't mind it at all. However, it only works for <span style=3D"fon=
t-family: courier new,monospace;">scoped_function</span>, <span style=3D"fo=
nt-family: courier new,monospace;">scoped_resource_unchecked</span> and <sp=
an style=3D"font-family: courier new,monospace;">scoped_resource</span>.&nb=
sp; I don't see any way that it can work for the much tighter, and IMO gene=
rally more useful <span style=3D"font-family: courier new,monospace;">uniqu=
e_resource</span>. <br></div><blockquote class=3D"gmail_quote" style=3D"mar=
gin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><=
div bgcolor=3D"#FFFFFF" text=3D"#000000">
<blockquote type=3D"cite">
<div><br>
I've made this easier in the updated reference implementation
and proposal by using names that clearly distinguish the types,
and "generator" function templates that use the make_...
convention.<br>
<br>
</div>
<blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex=
;border-left:1px #ccc solid;padding-left:1ex">
<div bgcolor=3D"#FFFFFF" text=3D"#000000"> <br>
I'm for the first overloading, which corresponds to the
interface Boost.ScopedExit has to make code portable.<br>
</div>
</blockquote>
<div>I'm sorry, I don't understand what you are saying there. <br>
</div>
</blockquote>
I meant the the first overload of make_scoped_exit, which now
corresponds to make_scoped_function. <br></div></blockquote><div>Okay..=
.. Your statement makes more sense now. I had to slow down and i=
nsert commas before I understood what you were saying. Thanks for cla=
rifying. <br></div><blockquote class=3D"gmail_quote" style=3D"margin: 0;mar=
gin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div bgcolo=
r=3D"#FFFFFF" text=3D"#000000">
<blockquote type=3D"cite">
<blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex=
;border-left:1px #ccc solid;padding-left:1ex">
<div bgcolor=3D"#FFFFFF" text=3D"#000000"> <br>
The example motivating the second overload not convince me as
we can use the simpler scoped_exit overload<br>
<br>
Instead of <br>
<code>
<pre>void drive_any_available_bus()
{
auto &&bus =3D std::scope_exit(lock_<wbr>available_bus(), unloc=
k_bus); // Always unlock the bus when done driving... No need to verif=
y the resource first
if(bus =3D=3D -1)
{
return; // No buses...
}
drive(bus);
}</pre>
</code>the following should do the same<br>
<code>
<pre>void drive_any_available_bus()
{
if(lock_available_bus()<code></code> =3D=3D -1) return;
<code><pre> auto &&bus =3D std::scope_exit(unlock_bus);
</pre></code> drive(bus);
}</pre>
</code></div>
</blockquote>
<div>Of course this will work, and this may be the best thing to
do in certain cases, but if you code defensively you will bind
the resource allocation to it's destruction, so that later on
someone can't come in and add code that could throw an exception
(for example) in between your allocation and your <span style=3D"fo=
nt-family:courier new,monospace">std::scope_exit()</span>
call.<br>
</div>
</blockquote>
I can understand the need for a wrapper that creates the resource on
construction and release them on destruction. I just think the
generic wrapper is not worth. At least your example should be much
more explicit and from the real world.<br></div></blockquote><div><br>T=
hanks, I will work on a better, more real-world example. <br></=
div><blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex=
;border-left: 1px #ccc solid;padding-left: 1ex;"><div bgcolor=3D"#FFFFFF" t=
ext=3D"#000000">
<blockquote type=3D"cite">
<div> <br>
</div>
<blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex=
;border-left:1px #ccc solid;padding-left:1ex">
<div bgcolor=3D"#FFFFFF" text=3D"#000000"><code>
<pre><code></code></pre>
</code>The same applies to the third overload<br>
<br>
<code>
<pre>// Open a file, ensure it is closed when we leave scope, i=
f the file descriptor is valid...
auto&& iFileDesc =3D std::scope_exit(_open(pszPath, O_WRONLY), _clo=
se, -1); // if _open returns -1, don't call _close...
if(iFileDesc.valid())
{
_write(iFileDesc, &data, sizeof(data));
}
</pre>
</code><code>
<pre>could be replaced by</pre>
</code><br>
<code> </code>
<pre><code><code><pre><code><pre><code><pre><code><pre>auto fd =
=3D _open(pszPath, O_WRONLY);</pre></code></pre></code></pre></code>if (fd =
!=3D -1) return; // ...</pre></code></code></pre>
<code><code>
<pre>auto&& guard =3D std::scope_exit( [&fd] { _=
close(fd); } );</pre>
</code></code><code><code>
<pre>_write(iFileDesc, &data, sizeof(data));</pre>
</code></code></div>
</blockquote>
<div><br>
Again, the same answer. Code it defensively. Don't assu=
me that
because this example is so simple it will never change. In re=
al
world code it is very likely that there will be other things
happening that could be moved between your allocation (the call
to<span style=3D"font-family:courier new,monospace"> _open</span>)
and the construction of <span style=3D"font-family:courier new,mono=
space">guard</span>. And it is even more likely that
there will be code prior to the <span style=3D"font-family:courier =
new,monospace">_open</span> that does validation and
constructs resources that will also need clean-up. By using
RAII wrappers throughout you have the liberty of using the
quick-exit <span style=3D"font-family:courier new,monospace">return=
</span>s
throughout the function.<br>
</div>
</blockquote>
<br>
What prevents the user of allocating the resource outside of the
scoped exit, as e.g. in<br>
<br>
<code>
<pre><code><pre>auto&& fd =3D _open(pszPath, O_WRONLY);
// do other things as throw an exception
</pre></code>auto&& iFileDesc =3D std::scope_exit(fd<code></code><c=
ode></code>, _close, -1); =09
if(iFileDesc.valid())
{
_write(iFileDesc, &data, sizeof(data));
}</pre></code></div></blockquote><div><br>Nothing does. But then noth=
ing stops you from doing this either:<br><div class=3D"prettyprint" style=
=3D"background-color: rgb(250, 250, 250); border-color: rgb(187, 187, 187);=
border-style: solid; border-width: 1px; word-wrap: break-word;"><code clas=
s=3D"prettyprint"><div class=3D"subprettyprint"><span style=3D"color: #000;=
" class=3D"styled-by-prettify"><br></span><span style=3D"color: #606;" clas=
s=3D"styled-by-prettify">SomeClass</span><span style=3D"color: #000;" class=
=3D"styled-by-prettify"> </span><span style=3D"color: #660;" class=3D"style=
d-by-prettify">*</span><span style=3D"color: #000;" class=3D"styled-by-pret=
tify">pInstance </span><span style=3D"color: #660;" class=3D"styled-by-pret=
tify">=3D</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> =
</span><span style=3D"color: #008;" class=3D"styled-by-prettify">new</span>=
<span style=3D"color: #000;" class=3D"styled-by-prettify"> </span><span sty=
le=3D"color: #606;" class=3D"styled-by-prettify">SomeClass</span><span styl=
e=3D"color: #660;" class=3D"styled-by-prettify">();</span><span style=3D"co=
lor: #000;" class=3D"styled-by-prettify"><br></span><span style=3D"color: #=
660;" class=3D"styled-by-prettify">.</span><span style=3D"color: #000;" cla=
ss=3D"styled-by-prettify"><br></span><span style=3D"color: #800;" class=3D"=
styled-by-prettify">// Do stuff with pInstance</span><span style=3D"color: =
#000;" class=3D"styled-by-prettify"><br></span><span style=3D"color: #660;"=
class=3D"styled-by-prettify">.</span><span style=3D"color: #000;" class=3D=
"styled-by-prettify"><br></span><span style=3D"color: #660;" class=3D"style=
d-by-prettify">.</span><span style=3D"color: #000;" class=3D"styled-by-pret=
tify"><br>std</span><span style=3D"color: #660;" class=3D"styled-by-prettif=
y">::</span><span style=3D"color: #000;" class=3D"styled-by-prettify">uniqu=
e_ptr</span><span style=3D"color: #660;" class=3D"styled-by-prettify"><<=
/span><span style=3D"color: #606;" class=3D"styled-by-prettify">SomeClass</=
span><span style=3D"color: #660;" class=3D"styled-by-prettify">></span><=
span style=3D"color: #000;" class=3D"styled-by-prettify"> pSomeClass</span>=
<span style=3D"color: #660;" class=3D"styled-by-prettify">(</span><span sty=
le=3D"color: #000;" class=3D"styled-by-prettify">pInstance</span><span styl=
e=3D"color: #660;" class=3D"styled-by-prettify">);</span><span style=3D"col=
or: #000;" class=3D"styled-by-prettify"><br></span></div></code></div><br>A=
nd yet we still have<span style=3D"font-family: courier new,monospace;"> st=
d::unique_ptr</span>, etc. <br></div><blockquote class=3D"gmail_quote" styl=
e=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left:=
1ex;"><div bgcolor=3D"#FFFFFF" text=3D"#000000"><code>
</code><br>
This is why I think that the wrapper must be specific<br>
<br>
{<br>
File f(pszPath, O_WRONLY<code></code><code></code>);<br>
// ...<br>
} // close called on destruction<br>
<br>
<br></div></blockquote><div>I don't think we are going to agree on that=
.. I would still do my File class like this:<br><div class=3D"prettypr=
int" style=3D"background-color: rgb(250, 250, 250); border-color: rgb(187, =
187, 187); border-style: solid; border-width: 1px; word-wrap: break-word;">=
<code class=3D"prettyprint"><div class=3D"subprettyprint"><span style=3D"co=
lor: #008;" class=3D"styled-by-prettify">class</span><span style=3D"color: =
#000;" class=3D"styled-by-prettify"> </span><span style=3D"color: #606;" cl=
ass=3D"styled-by-prettify">File</span><span style=3D"color: #000;" class=3D=
"styled-by-prettify"><br></span><span style=3D"color: #660;" class=3D"style=
d-by-prettify">{</span><span style=3D"color: #000;" class=3D"styled-by-pret=
tify"><br></span><span style=3D"color: #008;" class=3D"styled-by-prettify">=
private</span><span style=3D"color: #660;" class=3D"styled-by-prettify">:</=
span><span style=3D"color: #000;" class=3D"styled-by-prettify"><br> &=
nbsp; std</span><span style=3D"color: #660;" class=3D"styled-by-prettify">:=
:</span><span style=3D"color: #000;" class=3D"styled-by-prettify">unique_re=
source</span><span style=3D"color: #660;" class=3D"styled-by-prettify"><=
</span><span style=3D"color: #000;" class=3D"styled-by-prettify">UNIQUE_DEL=
ETER</span><span style=3D"color: #660;" class=3D"styled-by-prettify">(</spa=
n><span style=3D"color: #000;" class=3D"styled-by-prettify">close</span><sp=
an style=3D"color: #660;" class=3D"styled-by-prettify">),</span><span style=
=3D"color: #000;" class=3D"styled-by-prettify"> </span><span style=3D"color=
: #660;" class=3D"styled-by-prettify">-</span><span style=3D"color: #066;" =
class=3D"styled-by-prettify">1</span><span style=3D"color: #660;" class=3D"=
styled-by-prettify">></span><span style=3D"color: #000;" class=3D"styled=
-by-prettify"> m_iFd</span><span style=3D"color: #660;" class=3D"styled-by-=
prettify">;</span><span style=3D"color: #000;" class=3D"styled-by-prettify"=
><br></span><span style=3D"color: #008;" class=3D"styled-by-prettify">publi=
c</span><span style=3D"color: #660;" class=3D"styled-by-prettify">:</span><=
span style=3D"color: #000;" class=3D"styled-by-prettify"><br> =
</span><span style=3D"color: #606;" class=3D"styled-by-prettify">File</span=
><span style=3D"color: #660;" class=3D"styled-by-prettify">(</span><span st=
yle=3D"color: #008;" class=3D"styled-by-prettify">const</span><span style=
=3D"color: #000;" class=3D"styled-by-prettify"> </span><span style=3D"color=
: #008;" class=3D"styled-by-prettify">char</span><span style=3D"color: #000=
;" class=3D"styled-by-prettify"> </span><span style=3D"color: #660;" class=
=3D"styled-by-prettify">*</span><span style=3D"color: #000;" class=3D"style=
d-by-prettify">pszPath</span><span style=3D"color: #660;" class=3D"styled-b=
y-prettify">,</span><span style=3D"color: #000;" class=3D"styled-by-prettif=
y"> </span><span style=3D"color: #008;" class=3D"styled-by-prettify">int</s=
pan><span style=3D"color: #000;" class=3D"styled-by-prettify"> oflags</span=
><span style=3D"color: #660;" class=3D"styled-by-prettify">,</span><span st=
yle=3D"color: #000;" class=3D"styled-by-prettify"> </span><span style=3D"co=
lor: #008;" class=3D"styled-by-prettify">int</span><span style=3D"color: #0=
00;" class=3D"styled-by-prettify"> iCreateFlags</span><span style=3D"color:=
#660;" class=3D"styled-by-prettify">)</span><span style=3D"color: #000;" c=
lass=3D"styled-by-prettify"> </span><span style=3D"color: #660;" class=3D"s=
tyled-by-prettify">:</span><span style=3D"color: #000;" class=3D"styled-by-=
prettify"> m_iFd</span><span style=3D"color: #660;" class=3D"styled-by-pret=
tify">(</span><span style=3D"color: #000;" class=3D"styled-by-prettify">ope=
n</span><span style=3D"color: #660;" class=3D"styled-by-prettify">(</span><=
span style=3D"color: #000;" class=3D"styled-by-prettify">pszPath</span><spa=
n style=3D"color: #660;" class=3D"styled-by-prettify">,</span><span style=
=3D"color: #000;" class=3D"styled-by-prettify"> oflags</span><span style=3D=
"color: #660;" class=3D"styled-by-prettify">,</span><span style=3D"color: #=
000;" class=3D"styled-by-prettify"> iCreateFlags</span><span style=3D"color=
: #660;" class=3D"styled-by-prettify">))</span><span style=3D"color: #000;"=
class=3D"styled-by-prettify"><br> </span><span style=3D"color=
: #660;" class=3D"styled-by-prettify">{</span><span style=3D"color: #000;" =
class=3D"styled-by-prettify"><br> </span><span style=3D"color:=
#660;" class=3D"styled-by-prettify">}</span><span style=3D"color: #000;" c=
lass=3D"styled-by-prettify"><br> </span><span style=3D"color: =
#660;" class=3D"styled-by-prettify">.</span><span style=3D"color: #000;" cl=
ass=3D"styled-by-prettify"><br> </span><span style=3D"color: #=
660;" class=3D"styled-by-prettify">.</span><span style=3D"color: #000;" cla=
ss=3D"styled-by-prettify"><br> </span><span style=3D"color: #6=
60;" class=3D"styled-by-prettify">.</span><span style=3D"color: #000;" clas=
s=3D"styled-by-prettify"><br></span><span style=3D"color: #660;" class=3D"s=
tyled-by-prettify">};</span><span style=3D"color: #000;" class=3D"styled-by=
-prettify"> <br></span></div></code></div><br>Because again, I don't need a=
n explicit destructor, I guarantee the proper order of destruction, etc.<br=
></div><blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.=
8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div bgcolor=3D"#FFFFFF=
" text=3D"#000000">
<blockquote type=3D"cite">
<div><br>
Also, why declare a second named variable (<span style=3D"font-fami=
ly:courier new,monospace">guard</span>),
that never gets referenced? Bind the resource to its
deleter-function and use it naturally throughout the code,
without thinking again about it's clean-up.<br>
</div>
</blockquote>
I would like to see a way to using anonymous variables<br>
<br>
<code><code>
<pre>auto&& ... =3D std::scope_exit( [&fd] { _close(fd=
); } );
or<code><code> <pre>auto&& auto =3D std::scope_exit( [&fd] { =
_close(fd); } );</pre>
But this is a minor issue any way.
</code></code></pre></code></code></div></blockquote><div>That is a differ=
ent battle / proposal. I'm not opposed to it, but it has to be fought=
on its own. <br></div><blockquote class=3D"gmail_quote" style=3D"margin: 0=
;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div bg=
color=3D"#FFFFFF" text=3D"#000000"><code><code><pre><code><code> </code=
></code>
</pre>
</code></code>
<blockquote type=3D"cite">
<div><br>
</div>
<blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex=
;border-left:1px #ccc solid;padding-left:1ex">
<div bgcolor=3D"#FFFFFF" text=3D"#000000"><code><code> </code></cod=
e><code><code></code></code>The
last example concerns a resource wrapper with implicit
conversion to the underlying resource. One of the problems
with implicit conversions is that some overloads can be
missed. <br>
When wrapping a resource an alternative approach is to provide
the specific functions, in your case define a File wrapper,
but there is no need for a generic scoped_resource to
implement it.<br>
<br>
In particular the example could be implemented as<br>
<pre><code>class TestClassMember3
{
private:
FILE m_hEvent;
public:
TestClassMember2() : m_hEvent(CreateEvent(nullptr, TRUE, FALSE, nullptr=
))
{
}
~TestClassMember()=20
{
</code><code><code>CloseHandle</code>(</code><code><code>m_hEvent</=
code>);
}=20
// Other stuff here...
};</code></pre>
</div>
</blockquote>
<div>Again, in all of these examples you are breaking the tight
coupling of the resource acquisition to its destruction. </di=
v>
</blockquote>
Why? Here the class TestClassMemeber is playing the role of a specif
wrapper.<br></div></blockquote><div> </div><div>Because in reality=
it will probably do more than that. And even if it does not, by File=
example has less risk of someone screwing it up. <br></div><blockquote cla=
ss=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #=
ccc solid;padding-left: 1ex;"><div bgcolor=3D"#FFFFFF" text=3D"#000000">
<pre><code>
</code></pre>
<blockquote type=3D"cite">
<div>By using <span style=3D"font-family:courier new,monospace">std::=
unique_resource
</span>or <span style=3D"font-family:courier new,monospace">std::sc=
oped_resource</span>
as a class member variable, you ensure that destruction of the
resource occurs in the proper order (the reverse order of
initialization). You can eliminate the explicit destructor,
which might be written unintentionally to clean-up out-of-order.<br=
>
</div>
</blockquote>
I understand that it is the role of the specific wrapper to release
the resource :)<br>
<blockquote type=3D"cite">
<div><br>
The goal here is to get you to change your whole paradigm. If
you plan and declare the resource's lifetime when you initialize
it or when you declare it (as is the case with <span style=3D"font-=
family:courier new,monospace">std::unique_resource</span>),
you need not worry about remembering to put it in the
destructor. It's easy to remember in a class as simple as <sp=
an style=3D"font-family:courier new,monospace">TestClassMember2</span>,
but in real world code there will be much more to it, and the
fact is that these things are forgotten all of the time.<br>
</div>
</blockquote>
I don't think the generic classes you are proposing make the user to
change to the best 'paradigm'. I really think the user needs
specific wrappers, not these kind of generic raii classes that let
him the responsibility to declare an auxiliary class to release the
resource. A specific C++ class depending on the domain must be
defined to avoid the user been working with non-safe resources.
Well, this is just my opinion. <br></div></blockquote><div><br>Ag=
reed, that is your opinion and you are entitled to it. I just have to=
ask, were you equal opposed to <span style=3D"font-family: courier new,mon=
ospace;">std::unique_ptr</span> and <span style=3D"font-family: courier new=
,monospace;">std::shared_ptr</span>, because class could've been written wi=
th destructors that clean-up pointer too...? <br></div><blockquote class=3D=
"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc s=
olid;padding-left: 1ex;"><div bgcolor=3D"#FFFFFF" text=3D"#000000">
<blockquote type=3D"cite">
<div><br>
<span style=3D"font-family:courier new,monospace">std::unique_resou=
rce</span>
and <span style=3D"font-family:courier new,monospace">std::scoped_r=
esource</span>
also build in the validity checking. You can either call <spa=
n style=3D"font-family:courier new,monospace">.valid()</span> or
you can use the throw option to throw <span style=3D"font-family:co=
urier new,monospace">failed_resource_initialization</span>
on construction of the wrapper.<br>
<br>
</div>
<blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex=
;border-left:1px #ccc solid;padding-left:1ex">
<div bgcolor=3D"#FFFFFF" text=3D"#000000"> Resuming the simple
scoped_exit is enough to make a useful C++14 proposal that
covers all the examples you have on your current proposal and
could have good chances to be accepted.<br>
Of course this doesn't covers all the classes you wanted to
propose, but ...<br>
</div>
</blockquote>
<div>Again, I'm not following what you are trying to say here.
I've read it a couple of times and I must be missing something.<br>
</div>
</blockquote>
I meant that IMO only the fist overload is useful. The resource
abstractions are not. Proposing th scoped_exit function has a chance
to be accepted.<br></div></blockquote><div><br>Okay, thanks. If t=
he rest has no chance, I'm not hearing that from others. <br></div><blockqu=
ote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left=
: 1px #ccc solid;padding-left: 1ex;"><div bgcolor=3D"#FFFFFF" text=3D"#0000=
00">
<blockquote type=3D"cite">
<div> <br>
</div>
<blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex=
;border-left:1px #ccc solid;padding-left:1ex">
<div bgcolor=3D"#FFFFFF" text=3D"#000000"> <br>
The proposal could be complemented with scoped_success,
scoped_failure (based on D language). This could be possible
updating <code><span>std</span><span>::</span><span>uncaught_exce=
ption</span></code>
or any other mechanism so that failure or success conditions
can be determined.<br>
<br>
</div>
</blockquote>
<div>That was added using the option to throw an exception on
allocation / init failure. It needs to be optional however to
cover the broadest use cases, such as environment where
exceptions can't be tolerated.<br>
</div>
</blockquote>
I think you have not understood my concern. What you have added
lastly has nothing to be with scoped(success) scoped(failure). See
the D language documentation.<br></div></blockquote><div><br>Okay, too =
many languages in my head to have to worry about D too. <br></div><blockquo=
te class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left:=
1px #ccc solid;padding-left: 1ex;"><div bgcolor=3D"#FFFFFF" text=3D"#00000=
0">
<blockquote type=3D"cite">
<div> <br>
</div>
<div>Thanks Vicente. I hope I've answered your questions well.<=
/div>
</blockquote>
Now you did.<br>
Vicente<br></div></blockquote><div><br>Thanks,<br>Andrew Sandoval <br><=
/div>
<p></p>
-- <br />
<br />
<br />
<br />
------=_Part_367_18932490.1353187843350--
.
Author: "Vicente J. Botet Escriba" <vicente.botet@wanadoo.fr>
Date: Sun, 18 Nov 2012 18:30:26 +0100
Raw View
This is a multi-part message in MIME format.
--------------090705060004020404000001
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: quoted-printable
Le 17/11/12 07:01, Andrew Sandoval a =E9crit :
>
>
> Okay, I've updated the reference implementation to include these=20
> operators and the option of throwing exception on validity failure. =20
> I've also changed all of the "generator" function templates to more=20
> closely follow the standard, so we now havemake_scoped_function(),=20
> andmake_scoped_resource().
>
> I've updated draft of the proposal. It along with the links to the=20
> reference implementation are still at=20
> http://www.andrewlsandoval.com/scope_exit/.
>
Hi Andrew,
I've been thinking more about your proposal and I would like to share=20
with you an alternative design.
First we could start by defining the Resource requirements. Once we have=20
the Resource concept we can build on top of it the scoped_resource,=20
unique_resource and why not shared_resource.
IIUC the resources you are talking of are represented by builtin types,=20
either a pointer or an integral type, so I think that we can consider=20
that the underlying type is a regular type with an invalid value.
Resource requirements
R is a model of Resource if R is Regular and the following=20
requirements are satisfied where
R r;
R::value_type v;
R::value_type
The type of the resource that shall be Regular also.
R::invalid
the invalid value
R()
Constructs an invalid resource.
R(v)
Constructs a resource with a specific value.
r.release()
Release the resource
Next follows an example of a generic resource using static information=20
(as the one used by unique_resource)
template <typename R, R Invalid, void(*Release)(R)>
struct resource
{
typedef T value_type;
static constexpr value_type invalid() {return Invalid};
value_type value;
resource() noexcept : value(invalid()) {}
resource(value_type val) noexcept : value(val) {}
void release() {
Release(value);
};
};
The user could define specific resources, e.g. a resource representing a=20
file descriptor
typedef resource<int, -1, _close> fd;
or a specific structure
struct fd : resource<int, -1, _close>
{
typedef resource<int, -1, _close> base_type;
fd() noexcept : base_type() {}
fd(value_type val) noexcept : base_type(val) {}
};
Then the user could add some specific factories which could take care of=20
whether the resource construction shall throw or not
fd make_fd(fd::value_type val)
{
if (val =3D=3D fd::invalid) return fd(val);
else throw std::failed_resource_initialization;
}
fd make_fd(std::nothrow_t, fd::value_type val) noexcept
{
return fd(val);
}
Note that while this mean some effort from the user side, this should be=20
done only once. Do you find this reasonable?
Now we can define a simple scoped resource as follows
template<typename R>
class scoped_resource {
R resource_;
public:
explicit scoped_resource(R resource) : resource_(resource) {}
bool valid() const noexcept {
return resource_.value !=3D R::invalid();
}
~scoped_resource() {
if (valid()) resource_.release();
}
typename R::value_type get() const noexcept {
return resource_.value;
}
operator typename R::value_type() const noexcept {
return get();
}
};
The user can use this as follows
void test_scoped_resource_uref_resfail_throw()
{
try {
auto&& afdg =3D=20
std::make_scoped_resource(make_fd(_open("C:\\temp\\test4ndx.txt",=20
O_WRONLY)));
_write(afdg, "Test4FuncIntNdFail\r\n", 20);
}
catch (const std::failed_resource_initialization &e) {
std::cout << "Exception: " << e.what() << std::endl;
}
void test_scoped_resource_uref_resfail() {
auto&& afdg =3D std::make_scoped_resource(make_fd(std::nothrow,=20
_open("C:\\temp\\test4ndx.txt", O_WRONLY)));
// _open will return -1, so don't close...
if(afdg.valid()) {
_write(afdg, "test_scoped_resource_uref_resfail\r\n", 20);
}
}
Note that here we don't see any mention of what is the invalid value,=20
nor what is the deleter.
The user could also define specific scoped file descriptor factories
scoped_resource<fd> make_scoped_fd(fd::value_type val) {
return make_scoped_resource(make_fd(val));
}
scoped_resource<fd> make_fd(std::nothrow_t, fd::value_type val) {
return make_scoped_resource(make_fd(std::nothrow, val));
}
and use them as in
void test_scoped_resource_uref_resfail_throw() {
try {
auto&& afdg =3D make_scoped_fd(_open("C:\\temp\\test4ndx.txt",=20
O_WRONLY));
_write(afdg, "Test4FuncIntNdFail\r\n", 20);
} catch (const std::failed_resource_initialization &e) {
std::cout << "Exception: " << e.what() << std::endl;
}
}
void test_scoped_resource_uref_resfail() {
auto&& afdg =3D std::make_scoped_fd(std::nothrow,=20
_open("C:\\temp\\test4ndx.txt", O_WRONLY));
// _open will return -1, so don't close...
if(afdg.valid()) {
_write(afdg, "test_scoped_resource_uref_resfail\r\n", 20);
}
}
unique_resource could be defined based on your current implementation=20
with some minor changes.
And last it would be really great if we could have shared_resource=20
template class based on shared_ptr.
What do you think of this alternative design? Does it covers all your needs=
?
Best,
Vicente
--=20
--------------090705060004020404000001
Content-Type: text/html; charset=ISO-8859-1
<html>
<head>
<meta content="text/html; charset=ISO-8859-1"
http-equiv="Content-Type">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<div class="moz-cite-prefix">Le 17/11/12 07:01, Andrew Sandoval a
écrit :<br>
</div>
<blockquote
cite="mid:72d13339-4a9f-4714-9e7c-da4eb1c8832f@isocpp.org"
type="cite"><br>
<div><br>
Okay, I've updated the reference implementation to include these
operators and the option of throwing exception on validity
failure. I've also changed all of the "generator" function
templates to more closely follow the standard, so we now have<span
style="font-family: courier new,monospace;">
make_scoped_function()</span>, and<span style="font-family:
courier new,monospace;"> make_scoped_resource()</span>. <br>
<br>
I've updated draft of the proposal. It along with the links to
the reference implementation are still at <a
moz-do-not-send="true"
href="http://www.andrewlsandoval.com/scope_exit/">http://www.andrewlsandoval.com/scope_exit/</a>.<br>
<br>
</div>
</blockquote>
Hi Andrew,<br>
<br>
I've been thinking more about your proposal and I would like to
share with you an alternative design.<br>
<br>
First we could start by defining the Resource requirements. Once we
have the Resource concept we can build on top of it the
scoped_resource, unique_resource and why not shared_resource.<br>
<br>
IIUC the resources you are talking of are represented by builtin
types, either a pointer or an integral type, so I think that we can
consider that the underlying type is a regular type with an invalid
value.<br>
<br>
Resource requirements<br>
<br>
R is a model of Resource if R is Regular and the following
requirements are satisfied where<br>
R r;<br>
R::value_type v;<br>
<br>
R::value_type <br>
The type of the resource that shall be Regular also.<br>
<br>
R::invalid <br>
the invalid value<br>
<br>
R()<br>
Constructs an invalid resource.<br>
<br>
R(v)<br>
Constructs a resource with a specific value.<br>
<br>
r.release() <br>
Release the resource<br>
<br>
<br>
Next follows an example of a generic resource using static
information (as the one used by unique_resource)<br>
<br>
template <typename R, R Invalid, void(*Release)(R)><br>
struct resource<br>
{<br>
typedef T value_type;<br>
static constexpr value_type invalid() {return Invalid};<br>
value_type value;<br>
resource() noexcept : value(invalid()) {}<br>
resource(value_type val) noexcept : value(val) {}<br>
void release() {<br>
Release(value);<br>
};<br>
};<br>
<br>
The user could define specific resources, e.g. a resource
representing a file descriptor<br>
<br>
typedef resource<int, -1, _close> fd;<br>
<br>
or a specific structure<br>
<br>
struct fd : resource<int, -1, _close><br>
{<br>
typedef resource<int, -1, _close> base_type;<br>
fd() noexcept : base_type() {}<br>
fd(value_type val) noexcept : base_type(val) {}<br>
};<br>
<br>
Then the user could add some specific factories which could take
care of whether the resource construction shall throw or not<br>
<br>
fd make_fd(fd::value_type val)<br>
{<br>
if (val == fd::invalid) return fd(val);<br>
else throw std::failed_resource_initialization;<br>
}<br>
fd make_fd(std::nothrow_t, fd::value_type val) noexcept<br>
{<br>
return fd(val);<br>
}<br>
<br>
Note that while this mean some effort from the user side, this
should be done only once. Do you find this reasonable?<br>
<br>
Now we can define a simple scoped resource as follows<br>
<br>
template<typename R><br>
class scoped_resource {<br>
R resource_;<br>
public:<br>
explicit scoped_resource(R resource) : resource_(resource) {}<br>
bool valid() const noexcept {<br>
return resource_.value != R::invalid();<br>
}<br>
~scoped_resource() {<br>
if (valid()) resource_.release();<br>
}<br>
typename R::value_type get() const noexcept {<br>
return resource_.value;<br>
}<br>
operator typename R::value_type() const noexcept {<br>
return get();<br>
}<br>
};<br>
<br>
The user can use this as follows<br>
<br>
void test_scoped_resource_uref_resfail_throw()<br>
{<br>
try {<br>
auto&& afdg =
std::make_scoped_resource(make_fd(_open("C:\\temp\\test4ndx.txt",
O_WRONLY)));<br>
_write(afdg, "Test4FuncIntNdFail\r\n", 20);<br>
}<br>
catch (const std::failed_resource_initialization &e) {<br>
std::cout << "Exception: " << e.what() <<
std::endl;<br>
}<br>
<br>
void test_scoped_resource_uref_resfail() {<br>
auto&& afdg =
std::make_scoped_resource(make_fd(std::nothrow,
_open("C:\\temp\\test4ndx.txt", O_WRONLY)));<br>
// _open will return -1, so don't close...<br>
if(afdg.valid()) {<br>
_write(afdg, "test_scoped_resource_uref_resfail\r\n", 20);<br>
}<br>
}<br>
<br>
<br>
Note that here we don't see any mention of what is the invalid
value, nor what is the deleter.<br>
<br>
The user could also define specific scoped file descriptor factories<br>
<br>
scoped_resource<fd> make_scoped_fd(fd::value_type val) {<br>
return make_scoped_resource(make_fd(val));<br>
}<br>
scoped_resource<fd> make_fd(std::nothrow_t, fd::value_type
val) {<br>
return make_scoped_resource(make_fd(std::nothrow, val));<br>
} <br>
<br>
and use them as in<br>
<br>
void test_scoped_resource_uref_resfail_throw() {<br>
try {<br>
auto&& afdg =
make_scoped_fd(_open("C:\\temp\\test4ndx.txt", O_WRONLY));<br>
_write(afdg, "Test4FuncIntNdFail\r\n", 20);<br>
} catch (const std::failed_resource_initialization &e) {<br>
std::cout << "Exception: " << e.what() <<
std::endl;<br>
}<br>
}<br>
<br>
void test_scoped_resource_uref_resfail() {<br>
auto&& afdg = std::make_scoped_fd(std::nothrow,
_open("C:\\temp\\test4ndx.txt", O_WRONLY));<br>
// _open will return -1, so don't close...<br>
if(afdg.valid()) {<br>
_write(afdg, "test_scoped_resource_uref_resfail\r\n", 20);<br>
}<br>
}<br>
<br>
unique_resource could be defined based on your current
implementation with some minor changes.<br>
<br>
And last it would be really great if we could have shared_resource
template class based on shared_ptr.<br>
<br>
What do you think of this alternative design? Does it covers all
your needs?<br>
<br>
Best,<br>
Vicente<br>
<br>
</body>
</html>
<p></p>
-- <br />
<br />
<br />
<br />
--------------090705060004020404000001--
.
Author: Ville Voutilainen <ville.voutilainen@gmail.com>
Date: Sun, 18 Nov 2012 19:37:30 +0200
Raw View
On 18 November 2012 19:30, Vicente J. Botet Escriba
<vicente.botet@wanadoo.fr> wrote:
> Resource requirements
> R is a model of Resource if R is Regular and the following requirements
> are satisfied where
> R r;
> R::value_type v;
>
> R::value_type
> The type of the resource that shall be Regular also.
>
> R::invalid
> the invalid value
>
> R()
> Constructs an invalid resource.
>
> R(v)
> Constructs a resource with a specific value.
>
> r.release()
> Release the resource
>
>
> Next follows an example of a generic resource using static information (as
> the one used by unique_resource)
>
> template <typename R, R Invalid, void(*Release)(R)>
That won't work for quite many resource types. To be able to use a resource
as a non-type template parameter, we place quite stringent limitations
on what a resource can be. Class types for example are right out.
--
.
Author: Ville Voutilainen <ville.voutilainen@gmail.com>
Date: Sun, 18 Nov 2012 19:52:40 +0200
Raw View
On 17 November 2012 08:01, Andrew Sandoval <sandoval@netwaysglobal.com> wrote:
> Okay, I've updated the reference implementation to include these operators
> and the option of throwing exception on validity failure. I've also changed
> all of the "generator" function templates to more closely follow the
> standard, so we now have make_scoped_function(), and make_scoped_resource().
> I've updated draft of the proposal. It along with the links to the
> reference implementation are still at
> http://www.andrewlsandoval.com/scope_exit/.
> I will soon begin trying to fill in the Technical Details. Prior to that
> any additional feedback on the reference implementation or the proposal text
> will be appreciated.
> NOTE: The reference implementation requires std::remove_pointer and
> std::add_reference for the operator*. When I tried compiling with g++ 4.7.2
> on Windows there were compiler errors related to these type_traits. (Or
> maybe I just did something brain-dead.) I'll try to resolve that in the
> morning, but if anyone has experience with the differences in type_traits
> implementations and spots the problem before I do please let me know.
> Otherwise thank you for being patient. It does compile fine with VS 2010.
So, let me try to recap my understanding:
1) scoped_function just enables running a cleanup functor. Given a lambda,
it provides the bare minimum possible. If lambdas are allowed to define
how their captures are initialized, we have a quite good resource wrapper
then. (I don't think this proposal needs to wait for lambdas to get the
capture-initializers).
2) scoped_resource_unchecked wraps a resource and its deleter, allows
accessing it
through the scoped_resource_unchecked, and handles eg. resetting.
3) scoped_resource further allows recognizing invalid values, and provides the
option to throw when initialized with an invalid value.
4) unique_resource is lighter-weight and saves space, because it
doesn't actually store a deleter
object.
Did I get it right so far?
Of these, I expect scoped_resource to be the "default", since it's the
most capable and most generic.
I have trouble with the name unique_resource, because I don't see it
being similar to unique_ptr and
unique_lock in the sense that those are move-only resource handles.
The most important facility
of unique_resource isn't uniqueness, but rather that it's a
space-optimized variant of scoped_resource,
and doesn't allow the same breadth of possible deleter types.
I think operator& and operator-> should return the same thing. It's
actually a bit hairy to support both
pointers and non-pointers in that space, especially with operator*.
Also, some pointers are a bit hairy
to begin with, like FILE*. I don't know how to solve that problem nicely.
--
.
Author: Faisal Vali <faisalv@gmail.com>
Date: Sun, 18 Nov 2012 12:34:26 -0600
Raw View
er sorry about the omission - here's the link to Andrei's slides -
http://ecn.channel9.msdn.com/events/LangNEXT2012/AndreiLangNext.pdf
Faisal Vali
On Sun, Nov 18, 2012 at 12:33 PM, Faisal Vali <faisalv@gmail.com> wrote:
> This might not be pertinent to this discussion or might already have
> been discussed - so I apologize in advance if that is the case (and
> also for not reading all the posts in this thread) but is anyone
> familiar with 'D' s "scope" statement?
>
> I have included a link to Andrei's Lang.Next Slides (the first 30 are
> pertinent to this post) in which he attempts to demonstrate why he
> thinks the D solution ('scope statement') is superior to RAII.
>
> I am not proposing anything here, nor suggesting that a library
> solution should be replaced by a language feature - I just thought
> that our eventual solution to this problem might benefit from D's
> perspective - and wanted to make sure that if anyone was interested in
> exploring the solution space further, that this be on their radar.
>
> thanks!
> Faisal Vali
>
>
>
> On Sun, Nov 18, 2012 at 11:52 AM, Ville Voutilainen
> <ville.voutilainen@gmail.com> wrote:
>> On 17 November 2012 08:01, Andrew Sandoval <sandoval@netwaysglobal.com> wrote:
>>> Okay, I've updated the reference implementation to include these operators
>>> and the option of throwing exception on validity failure. I've also changed
>>> all of the "generator" function templates to more closely follow the
>>> standard, so we now have make_scoped_function(), and make_scoped_resource().
>>> I've updated draft of the proposal. It along with the links to the
>>> reference implementation are still at
>>> http://www.andrewlsandoval.com/scope_exit/.
>>> I will soon begin trying to fill in the Technical Details. Prior to that
>>> any additional feedback on the reference implementation or the proposal text
>>> will be appreciated.
>>> NOTE: The reference implementation requires std::remove_pointer and
>>> std::add_reference for the operator*. When I tried compiling with g++ 4.7.2
>>> on Windows there were compiler errors related to these type_traits. (Or
>>> maybe I just did something brain-dead.) I'll try to resolve that in the
>>> morning, but if anyone has experience with the differences in type_traits
>>> implementations and spots the problem before I do please let me know.
>>> Otherwise thank you for being patient. It does compile fine with VS 2010.
>>
>> So, let me try to recap my understanding:
>>
>> 1) scoped_function just enables running a cleanup functor. Given a lambda,
>> it provides the bare minimum possible. If lambdas are allowed to define
>> how their captures are initialized, we have a quite good resource wrapper
>> then. (I don't think this proposal needs to wait for lambdas to get the
>> capture-initializers).
>>
>> 2) scoped_resource_unchecked wraps a resource and its deleter, allows
>> accessing it
>> through the scoped_resource_unchecked, and handles eg. resetting.
>>
>> 3) scoped_resource further allows recognizing invalid values, and provides the
>> option to throw when initialized with an invalid value.
>>
>> 4) unique_resource is lighter-weight and saves space, because it
>> doesn't actually store a deleter
>> object.
>>
>> Did I get it right so far?
>>
>> Of these, I expect scoped_resource to be the "default", since it's the
>> most capable and most generic.
>> I have trouble with the name unique_resource, because I don't see it
>> being similar to unique_ptr and
>> unique_lock in the sense that those are move-only resource handles.
>> The most important facility
>> of unique_resource isn't uniqueness, but rather that it's a
>> space-optimized variant of scoped_resource,
>> and doesn't allow the same breadth of possible deleter types.
>>
>> I think operator& and operator-> should return the same thing. It's
>> actually a bit hairy to support both
>> pointers and non-pointers in that space, especially with operator*.
>> Also, some pointers are a bit hairy
>> to begin with, like FILE*. I don't know how to solve that problem nicely.
>>
>> --
>>
>>
>>
--
.
Author: Faisal Vali <faisalv@gmail.com>
Date: Sun, 18 Nov 2012 12:33:25 -0600
Raw View
--bcaec51b1bb9837b4304cec93c59
Content-Type: text/plain; charset=ISO-8859-1
This might not be pertinent to this discussion or might already have
been discussed - so I apologize in advance if that is the case (and
also for not reading all the posts in this thread) but is anyone
familiar with 'D' s "scope" statement?
I have included a link to Andrei's Lang.Next Slides (the first 30 are
pertinent to this post) in which he attempts to demonstrate why he
thinks the D solution ('scope statement') is superior to RAII.
I am not proposing anything here, nor suggesting that a library
solution should be replaced by a language feature - I just thought
that our eventual solution to this problem might benefit from D's
perspective - and wanted to make sure that if anyone was interested in
exploring the solution space further, that this be on their radar.
thanks!
Faisal Vali
On Sun, Nov 18, 2012 at 11:52 AM, Ville Voutilainen
<ville.voutilainen@gmail.com> wrote:
> On 17 November 2012 08:01, Andrew Sandoval <sandoval@netwaysglobal.com> wrote:
>> Okay, I've updated the reference implementation to include these operators
>> and the option of throwing exception on validity failure. I've also changed
>> all of the "generator" function templates to more closely follow the
>> standard, so we now have make_scoped_function(), and make_scoped_resource().
>> I've updated draft of the proposal. It along with the links to the
>> reference implementation are still at
>> http://www.andrewlsandoval.com/scope_exit/.
>> I will soon begin trying to fill in the Technical Details. Prior to that
>> any additional feedback on the reference implementation or the proposal text
>> will be appreciated.
>> NOTE: The reference implementation requires std::remove_pointer and
>> std::add_reference for the operator*. When I tried compiling with g++ 4.7.2
>> on Windows there were compiler errors related to these type_traits. (Or
>> maybe I just did something brain-dead.) I'll try to resolve that in the
>> morning, but if anyone has experience with the differences in type_traits
>> implementations and spots the problem before I do please let me know.
>> Otherwise thank you for being patient. It does compile fine with VS 2010.
>
> So, let me try to recap my understanding:
>
> 1) scoped_function just enables running a cleanup functor. Given a lambda,
> it provides the bare minimum possible. If lambdas are allowed to define
> how their captures are initialized, we have a quite good resource wrapper
> then. (I don't think this proposal needs to wait for lambdas to get the
> capture-initializers).
>
> 2) scoped_resource_unchecked wraps a resource and its deleter, allows
> accessing it
> through the scoped_resource_unchecked, and handles eg. resetting.
>
> 3) scoped_resource further allows recognizing invalid values, and provides the
> option to throw when initialized with an invalid value.
>
> 4) unique_resource is lighter-weight and saves space, because it
> doesn't actually store a deleter
> object.
>
> Did I get it right so far?
>
> Of these, I expect scoped_resource to be the "default", since it's the
> most capable and most generic.
> I have trouble with the name unique_resource, because I don't see it
> being similar to unique_ptr and
> unique_lock in the sense that those are move-only resource handles.
> The most important facility
> of unique_resource isn't uniqueness, but rather that it's a
> space-optimized variant of scoped_resource,
> and doesn't allow the same breadth of possible deleter types.
>
> I think operator& and operator-> should return the same thing. It's
> actually a bit hairy to support both
> pointers and non-pointers in that space, especially with operator*.
> Also, some pointers are a bit hairy
> to begin with, like FILE*. I don't know how to solve that problem nicely.
>
> --
>
>
>
--
--bcaec51b1bb9837b4304cec93c59
Content-Type: application/pdf; name="AndreiLangNext-2012.pdf"
Content-Disposition: attachment; filename="AndreiLangNext-2012.pdf"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_h9ohpywf0
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
nM5fXC++nrECcv74TRtRIjUpRbvoVFYd3PmH+fEQ4fzZlVtE6PVeRJTEi4ypw7fXO7y6Nv99wa6P
n0KJGk/o47OaGY3O1scvbZgaIFU5fzSPWJXhnNuA1UMVkXO6ttv9fv9CF2TcLsCosfeig+b1JxSr
HYi0whakW8UC3UQw6frLzVDJrFiv2kBKYiI+v9m0P1vaUZ/9W7u9GXgb5P0DAtYYNi8Der4R9vFm
QH/cXNf2pNNE5//ejudRN6RTWuixnSqVXOcX4rypvuKIOeH55XnzwctnTZyudoa9OH022T4bpFYF
lVc9+Kr1lqxeXpbeNzOh6w70Tmvv7ZS/2rS/27RfL+1a4Pz15vq7p8dVm6FBWSW9fnpcqNuClnWd
O/+4m2HMoqYQlxnWdTD1+l/rRaj6XP2zTWpf2Jrs9m7rcLKp/cLMnZO9neA3m/YXm/Znm8neTLDa
gmv7X4MxqudOV8Nw18Sr+Gnik0540m3iNPHM9bZXm+DfXNuNuLygPz+8+NWn57DpabWXR2hdn28+
dizC98akte6vN9dfL8tLcr2M89aI/LzWT73aNLk31u+7zWDfb9r/+Qmt3CoY0vQDJZPcgWY/Qvvd
l+aFb6zYh2n4O0Or27P9YJsWaxzcfFR2Ku8jqI3MKe0Mw4+3OvmLvGuKahmSOhZdfRLh1tPtlXRr
Xrd9vvoJdeAyIN1Xk5R5QDd2LwzazQattjGnPNSg6YtkZWcrPkyBtqv6682Ebc3ltv33A9O5ndR/
DswlSIAMBxr3y+jOZCB019S+1lZuzcRWLbYmYztDrf39T6k663i2qrMzoI9tq9NqFcdL75OH/wOJ
BjspZW5kc3RyZWFtCmVuZG9iagoxMTUgMCBvYmoKMzI4NAplbmRvYmoKMTE5IDAgb2JqCjw8L0xl
bmd0aCAxMjAgMCBSL0ZpbHRlciAvRmxhdGVEZWNvZGU+PgpzdHJlYW0KeJzFnM+vHLcNx+/vr1ig
l31AnyJSEiWhp7QIAuSW1EAPdQ+u48RGbbd2nMZF0f+95PzYmZU4T/TCbZAE3oz1WWpmKH45Imff
nbyDk5d/lj+fv7n74juC048/3b27w1KTy/mEMbmU6unNHRRyQPFy5PXlSKYcXYx8JJFPLhTlyEa9
vPvT6e2ddzXUmAJbrzmSryc4vf/xf2j2BzZZii/8P2wyVoTFZEoluwCXoVCcJ0ynHLEwcXr/4jGW
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
Wgbo2+fl14dkf/vQpqYSUkSu3KasNY6k63fr7PV0XvPdiHQ8vr12+0UirciWU6LnSlNPSwhVzwCt
IX69QIRF/9OPpe246IWdi06/PaEMSr1+vHvip3fbM4krXd/+qz2lhWCBG6+1Tr3+9HmdsOip+cU2
4UzXP6zxQGvHfH2/B6mU83V7pUI1ba8EQjrq84fjlX65v1K6/vYVtXPFfH17P/rj8bh9Cr95o5kl
Xj7o//8HuRdDWmVuZHN0cmVhbQplbmRvYmoKMTY2IDAgb2JqCjI4NDEKZW5kb2JqCjE3MCAwIG9i
ago8PC9MZW5ndGggMTcxIDAgUi9GaWx0ZXIgL0ZsYXRlRGVjb2RlPj4Kc3RyZWFtCnicK1Qw0DNU
MABBKJ2cy6UfZGaokF7MVQjkmlsYWuhZKugam1ma6JlYKOgaKJhYGJrrmRopGJrqmZlB1BuaGym4
5HMFchkopANJAPUxEWJlbmRzdHJlYW0KZW5kb2JqCjE3MSAwIG9iago3OQplbmRvYmoKMTc2IDAg
b2JqCjw8L0xlbmd0aCAxNzcgMCBSL0ZpbHRlciAvRmxhdGVEZWNvZGU+PgpzdHJlYW0KeJy1nM+O
JLcNh+/zFH3sCTJakaIo8bgJgiBBDo49QA5ODs7ueh1gZ50d27DzHAnyvKGqqrurS6wRt4HAht1T
o6+o0h/+WCJ7Ph1igENs/yz/f/N09+pLhsP7H+4+3WGVHEo5IOWQsxye7qByAKbzlQ/nK4ULBSK9
kjnmkKpx5UJ9d/eXw8e7GCQJ5aTWpRBHOcDh+f3/0ey3arLWWPUHNUmCsJjMuZaQ4NwUaoiM+VAI
qxKH53cvsSxB216xrWt7bAYoeGIzBKh+u1dsSgHwRruQQ8xju1jVwoYl4SByI1uqTvq4zybL+hu+
0S5hqDeaRQoljc1SYe7YyIHLbWyqNTCM+2yyJYZMn2E3gf56YTMGcoyVySbde44+cwHpWOCQHEvS
YlFqQLnNLtYYEG+0y6hu6EaWKERHnxXGjkUO0bEmTTaWIHybXagSHDvfRAuE6liSJpvTWhD2uizT
HRubY6knNqmYjD27zUIJTLfZjSIhjz27zVYIebwkBbMiW5ZToLEa2axCaTy/NouqoGM1stmoCjre
RhZLIhAcQ6VhBnRoUQEdi5HNZhXQsWe32eRYy2ewRP2wgNpaxnvIZmPbXWOWSXfphlVhDHXs1m2W
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
W6KnQNBmM3jcUptthUKOIWmykDu/1BtXU0GPXzo/2u/ZIo4CQRtl8NilNkvJk/jeWNQcbmUxO+zS
+clvj8bisUtNNlbx5L02W8DxxdIDNiePXWqzrU7I0efpkWTPQvHYpRYrovrpSI1Mtk5/P8YyetxS
EyWVz/1otsLSYjRtWeRQHVvVN1YFaFnYJap8Olx4i62i8unQXpMtGNhhq5lsVvl07L/OKdWObYVC
jhFpodqYHPugJhtVPh1lURZbWq2QowzGZFnl06G9s9TvWGKPZWqi2iQ6stAbq2NhWZsLqHo6ajss
lkXV01F+Y7IltXr/YZ9nGdmxOXtsUxNNKp6O8nqTBRVPx9aeyUZVT8dMsNjcCoYcu9zzGrVjOXvq
A02UVD0dqm2yrWDIkViZLKh6OnZu5wnQXqgYLvWQJKqejmcMk20FQ47KHZPNqp7jb3jabFL5dJSN
myxCiI7Eeb68OzZi8ybHcQ02tYIhx86tybLqp2OlM1lS/XS4GCbbKoaq41pNyI4F1U/HdqTFoqh+
OnadVmSGWqmQY0v+HsoqmY7HxnuIVCtHxSBwbY0Y0t4l3Pfr1jqqHo6q/K+tp9932T/Z7M/9x5M+
OomO3fN/9aNg0uRTrzeRSG6Tg2WyVH/4va58kNozNCwX5eV6pBSeqjefT3865YxzpZLqQpapkaZK
7XLMB7ZtCmtqoFPw1mg90lq1LwWBLnm3eOuRbTzQD9Xqk6/xkMucbtzirW1u8dZGd/HOU1EMNFMP
WrEjtoaxllZGsRx4vh7Q69hK/J5PKWduRRrdgSvySaEy7YhpR0p7PH65HlHVxmYStw5MtdF3rdYj
21YIXNuGOkyfIU3ngulXEtYj07kYU6BNo0SFWk3HttF6KuaMzfq5nWo9sjnVrdF6qm2jqOeRKm17
K1GMkwZNTiC0ofPGuzpMv+jD0vS7Scv/Prycf/O+/YJSPuvzV046a9/rNNMx/U7/jWfU8Ny+qJra
D1romy+nv1zS0zuNop+O4RKe3iV9QJZMl98+aTamI+jyz/Z+5CxU+PLy1HoEVfLlX8tx5FguP01/
ZNaVLV2e5z/0FqR0+XE+fdL18vLu33ftNifTVlhK0Cj6EpoVR3D5z5NeU33WgMvfN3183p7il23n
tq3uI919htc5VtLPtiVet20+bv742/s/nH73Xqd73E7vqJn9epOs42/cnopnaolFvr87bcdLz3Ju
u2ZVFXy6Oy+tI6w3DuZrPL/83/xSQ90dfl0OZ8Fbp3+N8YV6RJcBoPtP0L6trevAuT1qxbqMrw/t
LuuIh9L6pLDOwLbVpVdL4Xft1420C4qHxNPXI99/VOqvX9tnySxIvHB3QUEzwul7A3NzbEEINXG6
xOllilwvcDuK7abXgACX719vLT7eWnx9aj2A3Ibs9eBPM1ZALt9PA0+nhy5P2gTb0ETSWzF9PMQ2
Sq/cEkKP9yGiJF5iTA1+vp3hw+3lL1fs9vF11k6X9dOJpx/9kvXjT3NYM7cicinz8C6SLt/Nvdfb
ecmbFpvWm7H9Wf/7f8AJvoRlbmRzdHJlYW0KZW5kb2JqCjI3OCAwIG9iagozMDE5CmVuZG9iagoy
ODIgMCBvYmoKPDwvTGVuZ3RoIDI4MyAwIFIvRmlsdGVyIC9GbGF0ZURlY29kZT4+CnN0cmVhbQp4
nLWcQY8buw3H7/spfHQO0RMpkhKPr+hDgaKXvhegh7aHNknTAtkHJEHRfvxSMx7bO+KsGANFgsQ7
1s+UPRr+OfrT++WUE5xy/3P5//3z0w8/C5w+fXv68oRNOdV6QuLErKfnJ2iSQOh65PP1SJVKiciO
sGROpTlHbtQ/n/50+vUpJy1KXCy6VpKsJzh9/fR/DPsPC9labvaDhSRFuIRkbjUVuA6FlrIgnyph
M+L09eNrrGiysS/YPrUjlgEqbixDghaP+4ItJQE+GBc4ZZ7HxWYRdiypJNUH2drspM/n7LJiz8iD
cQlTezAsUqplHpaqyMBmSVIfY0trSWA+Z5etOTF9R9wC9vSFZUwU+Kxctti1F5izVNCBBUklsCQ9
FrUl1MfiYssJ8cG4gpaGHmSJUg7M2WAcWJSUA2vSZXNNKo/FhaYpcOW7aIXUAkvSZbncC8LRlHV5
xc5yrm1ji4nJPLP7LNQk9FjcrJp4ntl9tkHi+ZJUZEP2rJREczXyWYPK/Pz6LJqCztXIZ7Mp6Pwy
8lhShRT4qKzMgAGtJqBzMfJZNgGdZ3afLYG1fAVrtgcX0Ebr/Bry2dyvrjkrZFfpjjVhTG2e1n1W
TD7nad1nyeRzLkU+a2MksDBcFkw+A+uxUWl7tqrJ5zyt+2wvXedp3WfZ5HOe1n22tPQ9YfvDDUVT
z+mStMVXFAY2m3pOLwWflUYJpmn9gBVTz2laP2DJ1HN6GR2waOo5XZKasRANLJh8TtO6z7KafE7T
+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
eHRdCi9FeHRHU3RhdGUgNjYgMCBSCi9Gb250IDY3IDAgUgo+PgovQ29udGVudHMgNTkgMCBSCi9U
cmFuczw8Ci9TIC9SZXBsYWNlCj4+Cj4+CmVuZG9iago2OCAwIG9iago8PC9UeXBlL1BhZ2UvTWVk
aWFCb3ggWzAgMCA1OTQgNzkyXQovUm90YXRlIDkwL1BhcmVudCAzIDAgUgovUmVzb3VyY2VzPDwv
UHJvY1NldFsvUERGIC9UZXh0XQovRXh0R1N0YXRlIDcxIDAgUgovRm9udCA3MiAwIFIKPj4KL0Nv
bnRlbnRzIDY5IDAgUgovVHJhbnM8PAovUyAvUmVwbGFjZQo+Pgo+PgplbmRvYmoKNzMgMCBvYmoK
PDwvVHlwZS9QYWdlL01lZGlhQm94IFswIDAgNTk0IDc5Ml0KL1JvdGF0ZSA5MC9QYXJlbnQgMyAw
IFIKL1Jlc291cmNlczw8L1Byb2NTZXRbL1BERiAvSW1hZ2VDXQovRXh0R1N0YXRlIDc3IDAgUgov
WE9iamVjdCA3OCAwIFIKPj4KL0NvbnRlbnRzIDc0IDAgUgovVHJhbnM8PAovUyAvUmVwbGFjZQo+
Pgo+PgplbmRvYmoKNzkgMCBvYmoKPDwvVHlwZS9QYWdlL01lZGlhQm94IFswIDAgNTk0IDc5Ml0K
L1JvdGF0ZSA5MC9QYXJlbnQgMyAwIFIKL1Jlc291cmNlczw8L1Byb2NTZXRbL1BERiAvVGV4dF0K
L0V4dEdTdGF0ZSA4NCAwIFIKL0ZvbnQgODUgMCBSCj4+Ci9Db250ZW50cyA4MCAwIFIKL1RyYW5z
PDwKL1MgL1JlcGxhY2UKPj4KPj4KZW5kb2JqCjg2IDAgb2JqCjw8L1R5cGUvUGFnZS9NZWRpYUJv
eCBbMCAwIDU5NCA3OTJdCi9Sb3RhdGUgOTAvUGFyZW50IDMgMCBSCi9SZXNvdXJjZXM8PC9Qcm9j
U2V0Wy9QREYgL1RleHRdCi9FeHRHU3RhdGUgOTEgMCBSCi9Gb250IDkyIDAgUgo+PgovQ29udGVu
dHMgODcgMCBSCi9UcmFuczw8Ci9TIC9SZXBsYWNlCj4+Cj4+CmVuZG9iago5MyAwIG9iago8PC9U
eXBlL1BhZ2UvTWVkaWFCb3ggWzAgMCA1OTQgNzkyXQovUm90YXRlIDkwL1BhcmVudCAzIDAgUgov
UmVzb3VyY2VzPDwvUHJvY1NldFsvUERGIC9UZXh0XQovRXh0R1N0YXRlIDk2IDAgUgovRm9udCA5
NyAwIFIKPj4KL0NvbnRlbnRzIDk0IDAgUgovVHJhbnM8PAovUyAvUmVwbGFjZQo+Pgo+PgplbmRv
YmoKOTggMCBvYmoKPDwvVHlwZS9QYWdlL01lZGlhQm94IFswIDAgNTk0IDc5Ml0KL1JvdGF0ZSA5
MC9QYXJlbnQgMyAwIFIKL1Jlc291cmNlczw8L1Byb2NTZXRbL1BERiAvVGV4dF0KL0V4dEdTdGF0
ZSAxMDEgMCBSCi9Gb250IDEwMiAwIFIKPj4KL0NvbnRlbnRzIDk5IDAgUgovVHJhbnM8PAovUyAv
UmVwbGFjZQo+Pgo+PgplbmRvYmoKMTAzIDAgb2JqCjw8L1R5cGUvUGFnZS9NZWRpYUJveCBbMCAw
IDU5NCA3OTJdCi9Sb3RhdGUgOTAvUGFyZW50IDMgMCBSCi9SZXNvdXJjZXM8PC9Qcm9jU2V0Wy9Q
REYgL1RleHRdCi9FeHRHU3RhdGUgMTA2IDAgUgovRm9udCAxMDcgMCBSCj4+Ci9Db250ZW50cyAx
MDQgMCBSCi9UcmFuczw8Ci9TIC9SZXBsYWNlCj4+Cj4+CmVuZG9iagoxMDggMCBvYmoKPDwvVHlw
ZS9QYWdlL01lZGlhQm94IFswIDAgNTk0IDc5Ml0KL1JvdGF0ZSA5MC9QYXJlbnQgMyAwIFIKL1Jl
c291cmNlczw8L1Byb2NTZXRbL1BERiAvVGV4dF0KL0V4dEdTdGF0ZSAxMTEgMCBSCi9Gb250IDEx
MiAwIFIKPj4KL0NvbnRlbnRzIDEwOSAwIFIKL1RyYW5zPDwKL1MgL1JlcGxhY2UKPj4KPj4KZW5k
b2JqCjExMyAwIG9iago8PC9UeXBlL1BhZ2UvTWVkaWFCb3ggWzAgMCA1OTQgNzkyXQovUm90YXRl
IDkwL1BhcmVudCAzIDAgUgovUmVzb3VyY2VzPDwvUHJvY1NldFsvUERGIC9UZXh0XQovRXh0R1N0
YXRlIDExNiAwIFIKL0ZvbnQgMTE3IDAgUgo+PgovQ29udGVudHMgMTE0IDAgUgovVHJhbnM8PAov
UyAvUmVwbGFjZQo+Pgo+PgplbmRvYmoKMTE4IDAgb2JqCjw8L1R5cGUvUGFnZS9NZWRpYUJveCBb
MCAwIDU5NCA3OTJdCi9Sb3RhdGUgOTAvUGFyZW50IDMgMCBSCi9SZXNvdXJjZXM8PC9Qcm9jU2V0
Wy9QREYgL1RleHRdCi9FeHRHU3RhdGUgMTIxIDAgUgovRm9udCAxMjIgMCBSCj4+Ci9Db250ZW50
cyAxMTkgMCBSCi9UcmFuczw8Ci9TIC9SZXBsYWNlCj4+Cj4+CmVuZG9iagoxMjMgMCBvYmoKPDwv
VHlwZS9QYWdlL01lZGlhQm94IFswIDAgNTk0IDc5Ml0KL1JvdGF0ZSA5MC9QYXJlbnQgMyAwIFIK
L1Jlc291cmNlczw8L1Byb2NTZXRbL1BERiAvVGV4dF0KL0V4dEdTdGF0ZSAxMjYgMCBSCi9Gb250
IDEyNyAwIFIKPj4KL0NvbnRlbnRzIDEyNCAwIFIKL1RyYW5zPDwKL1MgL1JlcGxhY2UKPj4KPj4K
ZW5kb2JqCjEyOCAwIG9iago8PC9UeXBlL1BhZ2UvTWVkaWFCb3ggWzAgMCA1OTQgNzkyXQovUm90
YXRlIDkwL1BhcmVudCAzIDAgUgovUmVzb3VyY2VzPDwvUHJvY1NldFsvUERGIC9JbWFnZUMgL1Rl
eHRdCi9FeHRHU3RhdGUgMTMyIDAgUgovWE9iamVjdCAxMzMgMCBSCi9Gb250IDEzNCAwIFIKPj4K
L0NvbnRlbnRzIDEyOSAwIFIKL1RyYW5zPDwKL1MgL1JlcGxhY2UKPj4KPj4KZW5kb2JqCjEzNSAw
IG9iago8PC9UeXBlL1BhZ2UvTWVkaWFCb3ggWzAgMCA1OTQgNzkyXQovUm90YXRlIDkwL1BhcmVu
dCAzIDAgUgovUmVzb3VyY2VzPDwvUHJvY1NldFsvUERGIC9UZXh0XQovRXh0R1N0YXRlIDE0MCAw
IFIKL0ZvbnQgMTQxIDAgUgo+PgovQ29udGVudHMgMTM2IDAgUgovVHJhbnM8PAovUyAvUmVwbGFj
ZQo+Pgo+PgplbmRvYmoKMTQyIDAgb2JqCjw8L1R5cGUvUGFnZS9NZWRpYUJveCBbMCAwIDU5NCA3
OTJdCi9Sb3RhdGUgOTAvUGFyZW50IDMgMCBSCi9SZXNvdXJjZXM8PC9Qcm9jU2V0Wy9QREYgL1Rl
eHRdCi9FeHRHU3RhdGUgMTQ1IDAgUgovRm9udCAxNDYgMCBSCj4+Ci9Db250ZW50cyAxNDMgMCBS
Ci9UcmFuczw8Ci9TIC9SZXBsYWNlCj4+Cj4+CmVuZG9iagoxNDcgMCBvYmoKPDwvVHlwZS9QYWdl
L01lZGlhQm94IFswIDAgNTk0IDc5Ml0KL1JvdGF0ZSA5MC9QYXJlbnQgMyAwIFIKL1Jlc291cmNl
czw8L1Byb2NTZXRbL1BERiAvVGV4dF0KL0V4dEdTdGF0ZSAxNTAgMCBSCi9Gb250IDE1MSAwIFIK
Pj4KL0NvbnRlbnRzIDE0OCAwIFIKL1RyYW5zPDwKL1MgL1JlcGxhY2UKPj4KPj4KZW5kb2JqCjE1
MiAwIG9iago8PC9UeXBlL1BhZ2UvTWVkaWFCb3ggWzAgMCA1OTQgNzkyXQovUm90YXRlIDkwL1Bh
cmVudCAzIDAgUgovUmVzb3VyY2VzPDwvUHJvY1NldFsvUERGIC9UZXh0XQovRXh0R1N0YXRlIDE1
NyAwIFIKL0ZvbnQgMTU4IDAgUgo+PgovQ29udGVudHMgMTUzIDAgUgovVHJhbnM8PAovUyAvUmVw
bGFjZQo+Pgo+PgplbmRvYmoKMTU5IDAgb2JqCjw8L1R5cGUvUGFnZS9NZWRpYUJveCBbMCAwIDU5
NCA3OTJdCi9Sb3RhdGUgOTAvUGFyZW50IDMgMCBSCi9SZXNvdXJjZXM8PC9Qcm9jU2V0Wy9QREYg
L1RleHRdCi9FeHRHU3RhdGUgMTYyIDAgUgovRm9udCAxNjMgMCBSCj4+Ci9Db250ZW50cyAxNjAg
MCBSCi9UcmFuczw8Ci9TIC9SZXBsYWNlCj4+Cj4+CmVuZG9iagoxNjQgMCBvYmoKPDwvVHlwZS9Q
YWdlL01lZGlhQm94IFswIDAgNTk0IDc5Ml0KL1JvdGF0ZSA5MC9QYXJlbnQgMyAwIFIKL1Jlc291
cmNlczw8L1Byb2NTZXRbL1BERiAvVGV4dF0KL0V4dEdTdGF0ZSAxNjcgMCBSCi9Gb250IDE2OCAw
IFIKPj4KL0NvbnRlbnRzIDE2NSAwIFIKL1RyYW5zPDwKL1MgL1JlcGxhY2UKPj4KPj4KZW5kb2Jq
CjE2OSAwIG9iago8PC9UeXBlL1BhZ2UvTWVkaWFCb3ggWzAgMCA1OTQgNzkyXQovUm90YXRlIDkw
L1BhcmVudCAzIDAgUgovUmVzb3VyY2VzPDwvUHJvY1NldFsvUERGIC9JbWFnZUNdCi9FeHRHU3Rh
dGUgMTczIDAgUgovWE9iamVjdCAxNzQgMCBSCj4+Ci9Db250ZW50cyAxNzAgMCBSCi9UcmFuczw8
Ci9TIC9SZXBsYWNlCj4+Cj4+CmVuZG9iagoxNzUgMCBvYmoKPDwvVHlwZS9QYWdlL01lZGlhQm94
IFswIDAgNTk0IDc5Ml0KL1JvdGF0ZSA5MC9QYXJlbnQgMyAwIFIKL1Jlc291cmNlczw8L1Byb2NT
ZXRbL1BERiAvVGV4dF0KL0V4dEdTdGF0ZSAxNzggMCBSCi9Gb250IDE3OSAwIFIKPj4KL0NvbnRl
bnRzIDE3NiAwIFIKL1RyYW5zPDwKL1MgL1JlcGxhY2UKPj4KPj4KZW5kb2JqCjE4MCAwIG9iago8
PC9UeXBlL1BhZ2UvTWVkaWFCb3ggWzAgMCA1OTQgNzkyXQovUm90YXRlIDkwL1BhcmVudCAzIDAg
UgovUmVzb3VyY2VzPDwvUHJvY1NldFsvUERGIC9UZXh0XQovRXh0R1N0YXRlIDE4MyAwIFIKL0Zv
bnQgMTg0IDAgUgo+PgovQ29udGVudHMgMTgxIDAgUgovVHJhbnM8PAovUyAvUmVwbGFjZQo+Pgo+
PgplbmRvYmoKMTg1IDAgb2JqCjw8L1R5cGUvUGFnZS9NZWRpYUJveCBbMCAwIDU5NCA3OTJdCi9S
b3RhdGUgOTAvUGFyZW50IDMgMCBSCi9SZXNvdXJjZXM8PC9Qcm9jU2V0Wy9QREYgL1RleHRdCi9F
eHRHU3RhdGUgMTg4IDAgUgovRm9udCAxODkgMCBSCj4+Ci9Db250ZW50cyAxODYgMCBSCi9UcmFu
czw8Ci9TIC9SZXBsYWNlCj4+Cj4+CmVuZG9iagoxOTAgMCBvYmoKPDwvVHlwZS9QYWdlL01lZGlh
Qm94IFswIDAgNTk0IDc5Ml0KL1JvdGF0ZSA5MC9QYXJlbnQgMyAwIFIKL1Jlc291cmNlczw8L1By
b2NTZXRbL1BERiAvVGV4dF0KL0V4dEdTdGF0ZSAxOTMgMCBSCi9Gb250IDE5NCAwIFIKPj4KL0Nv
bnRlbnRzIDE5MSAwIFIKL1RyYW5zPDwKL1MgL1JlcGxhY2UKPj4KPj4KZW5kb2JqCjE5NSAwIG9i
ago8PC9UeXBlL1BhZ2UvTWVkaWFCb3ggWzAgMCA1OTQgNzkyXQovUm90YXRlIDkwL1BhcmVudCAz
IDAgUgovUmVzb3VyY2VzPDwvUHJvY1NldFsvUERGIC9UZXh0XQovRXh0R1N0YXRlIDE5OCAwIFIK
L0ZvbnQgMTk5IDAgUgo+PgovQ29udGVudHMgMTk2IDAgUgovVHJhbnM8PAovUyAvUmVwbGFjZQo+
Pgo+PgplbmRvYmoKMjAwIDAgb2JqCjw8L1R5cGUvUGFnZS9NZWRpYUJveCBbMCAwIDU5NCA3OTJd
Ci9Sb3RhdGUgOTAvUGFyZW50IDMgMCBSCi9SZXNvdXJjZXM8PC9Qcm9jU2V0Wy9QREYgL0ltYWdl
QyAvVGV4dF0KL0V4dEdTdGF0ZSAyMDUgMCBSCi9YT2JqZWN0IDIwNiAwIFIKL0ZvbnQgMjA3IDAg
Ugo+PgovQ29udGVudHMgMjAxIDAgUgovVHJhbnM8PAovUyAvUmVwbGFjZQo+Pgo+PgplbmRvYmoK
MjA4IDAgb2JqCjw8L1R5cGUvUGFnZS9NZWRpYUJveCBbMCAwIDU5NCA3OTJdCi9Sb3RhdGUgOTAv
UGFyZW50IDMgMCBSCi9SZXNvdXJjZXM8PC9Qcm9jU2V0Wy9QREYgL1RleHRdCi9FeHRHU3RhdGUg
MjExIDAgUgovRm9udCAyMTIgMCBSCj4+Ci9Db250ZW50cyAyMDkgMCBSCi9UcmFuczw8Ci9TIC9S
ZXBsYWNlCj4+Cj4+CmVuZG9iagoyMTMgMCBvYmoKPDwvVHlwZS9QYWdlL01lZGlhQm94IFswIDAg
NTk0IDc5Ml0KL1JvdGF0ZSA5MC9QYXJlbnQgMyAwIFIKL1Jlc291cmNlczw8L1Byb2NTZXRbL1BE
RiAvVGV4dF0KL0V4dEdTdGF0ZSAyMTcgMCBSCi9Gb250IDIxOCAwIFIKPj4KL0NvbnRlbnRzIDIx
NCAwIFIKL1RyYW5zPDwKL1MgL1JlcGxhY2UKPj4KPj4KZW5kb2JqCjIxOSAwIG9iago8PC9UeXBl
L1BhZ2UvTWVkaWFCb3ggWzAgMCA1OTQgNzkyXQovUm90YXRlIDkwL1BhcmVudCAzIDAgUgovUmVz
b3VyY2VzPDwvUHJvY1NldFsvUERGIC9UZXh0XQovRXh0R1N0YXRlIDIyMiAwIFIKL0ZvbnQgMjIz
IDAgUgo+PgovQ29udGVudHMgMjIwIDAgUgovVHJhbnM8PAovUyAvUmVwbGFjZQo+Pgo+PgplbmRv
YmoKMjI0IDAgb2JqCjw8L1R5cGUvUGFnZS9NZWRpYUJveCBbMCAwIDU5NCA3OTJdCi9Sb3RhdGUg
OTAvUGFyZW50IDMgMCBSCi9SZXNvdXJjZXM8PC9Qcm9jU2V0Wy9QREYgL1RleHRdCi9FeHRHU3Rh
dGUgMjI3IDAgUgovRm9udCAyMjggMCBSCj4+Ci9Db250ZW50cyAyMjUgMCBSCi9UcmFuczw8Ci9T
IC9SZXBsYWNlCj4+Cj4+CmVuZG9iagoyMjkgMCBvYmoKPDwvVHlwZS9QYWdlL01lZGlhQm94IFsw
IDAgNTk0IDc5Ml0KL1JvdGF0ZSA5MC9QYXJlbnQgMyAwIFIKL1Jlc291cmNlczw8L1Byb2NTZXRb
L1BERiAvVGV4dF0KL0V4dEdTdGF0ZSAyMzIgMCBSCi9Gb250IDIzMyAwIFIKPj4KL0NvbnRlbnRz
IDIzMCAwIFIKL1RyYW5zPDwKL1MgL1JlcGxhY2UKPj4KPj4KZW5kb2JqCjIzNCAwIG9iago8PC9U
eXBlL1BhZ2UvTWVkaWFCb3ggWzAgMCA1OTQgNzkyXQovUm90YXRlIDkwL1BhcmVudCAzIDAgUgov
UmVzb3VyY2VzPDwvUHJvY1NldFsvUERGIC9UZXh0XQovRXh0R1N0YXRlIDIzNyAwIFIKL0ZvbnQg
MjM4IDAgUgo+PgovQ29udGVudHMgMjM1IDAgUgovVHJhbnM8PAovUyAvUmVwbGFjZQo+Pgo+Pgpl
bmRvYmoKMjM5IDAgb2JqCjw8L1R5cGUvUGFnZS9NZWRpYUJveCBbMCAwIDU5NCA3OTJdCi9Sb3Rh
dGUgOTAvUGFyZW50IDMgMCBSCi9SZXNvdXJjZXM8PC9Qcm9jU2V0Wy9QREYgL1RleHRdCi9FeHRH
U3RhdGUgMjQyIDAgUgovRm9udCAyNDMgMCBSCj4+Ci9Db250ZW50cyAyNDAgMCBSCi9UcmFuczw8
Ci9TIC9SZXBsYWNlCj4+Cj4+CmVuZG9iagoyNDQgMCBvYmoKPDwvVHlwZS9QYWdlL01lZGlhQm94
IFswIDAgNTk0IDc5Ml0KL1JvdGF0ZSA5MC9QYXJlbnQgMyAwIFIKL1Jlc291cmNlczw8L1Byb2NT
ZXRbL1BERiAvVGV4dF0KL0V4dEdTdGF0ZSAyNDkgMCBSCi9Gb250IDI1MCAwIFIKPj4KL0NvbnRl
bnRzIDI0NSAwIFIKL1RyYW5zPDwKL1MgL1JlcGxhY2UKPj4KPj4KZW5kb2JqCjI1MSAwIG9iago8
PC9UeXBlL1BhZ2UvTWVkaWFCb3ggWzAgMCA1OTQgNzkyXQovUm90YXRlIDkwL1BhcmVudCAzIDAg
UgovUmVzb3VyY2VzPDwvUHJvY1NldFsvUERGIC9UZXh0XQovRXh0R1N0YXRlIDI1NCAwIFIKL0Zv
bnQgMjU1IDAgUgo+PgovQ29udGVudHMgMjUyIDAgUgovVHJhbnM8PAovUyAvUmVwbGFjZQo+Pgo+
PgplbmRvYmoKMjU2IDAgb2JqCjw8L1R5cGUvUGFnZS9NZWRpYUJveCBbMCAwIDU5NCA3OTJdCi9S
b3RhdGUgOTAvUGFyZW50IDMgMCBSCi9SZXNvdXJjZXM8PC9Qcm9jU2V0Wy9QREYgL1RleHRdCi9F
eHRHU3RhdGUgMjU5IDAgUgovRm9udCAyNjAgMCBSCj4+Ci9Db250ZW50cyAyNTcgMCBSCi9UcmFu
czw8Ci9TIC9SZXBsYWNlCj4+Cj4+CmVuZG9iagoyNjEgMCBvYmoKPDwvVHlwZS9QYWdlL01lZGlh
Qm94IFswIDAgNTk0IDc5Ml0KL1JvdGF0ZSA5MC9QYXJlbnQgMyAwIFIKL1Jlc291cmNlczw8L1By
b2NTZXRbL1BERiAvVGV4dF0KL0V4dEdTdGF0ZSAyNjQgMCBSCi9Gb250IDI2NSAwIFIKPj4KL0Nv
bnRlbnRzIDI2MiAwIFIKL1RyYW5zPDwKL1MgL1JlcGxhY2UKPj4KPj4KZW5kb2JqCjI2NiAwIG9i
ago8PC9UeXBlL1BhZ2UvTWVkaWFCb3ggWzAgMCA1OTQgNzkyXQovUm90YXRlIDkwL1BhcmVudCAz
IDAgUgovUmVzb3VyY2VzPDwvUHJvY1NldFsvUERGIC9UZXh0XQovRXh0R1N0YXRlIDI2OSAwIFIK
L0ZvbnQgMjcwIDAgUgo+PgovQ29udGVudHMgMjY3IDAgUgovVHJhbnM8PAovUyAvUmVwbGFjZQo+
Pgo+PgplbmRvYmoKMjcxIDAgb2JqCjw8L1R5cGUvUGFnZS9NZWRpYUJveCBbMCAwIDU5NCA3OTJd
Ci9Sb3RhdGUgOTAvUGFyZW50IDMgMCBSCi9SZXNvdXJjZXM8PC9Qcm9jU2V0Wy9QREYgL1RleHRd
Ci9FeHRHU3RhdGUgMjc0IDAgUgovRm9udCAyNzUgMCBSCj4+Ci9Db250ZW50cyAyNzIgMCBSCi9U
cmFuczw8Ci9TIC9SZXBsYWNlCj4+Cj4+CmVuZG9iagoyNzYgMCBvYmoKPDwvVHlwZS9QYWdlL01l
ZGlhQm94IFswIDAgNTk0IDc5Ml0KL1JvdGF0ZSA5MC9QYXJlbnQgMyAwIFIKL1Jlc291cmNlczw8
L1Byb2NTZXRbL1BERiAvVGV4dF0KL0V4dEdTdGF0ZSAyNzkgMCBSCi9Gb250IDI4MCAwIFIKPj4K
L0NvbnRlbnRzIDI3NyAwIFIKL1RyYW5zPDwKL1MgL1JlcGxhY2UKPj4KPj4KZW5kb2JqCjI4MSAw
IG9iago8PC9UeXBlL1BhZ2UvTWVkaWFCb3ggWzAgMCA1OTQgNzkyXQovUm90YXRlIDkwL1BhcmVu
dCAzIDAgUgovUmVzb3VyY2VzPDwvUHJvY1NldFsvUERGIC9UZXh0XQovRXh0R1N0YXRlIDI4NCAw
IFIKL0ZvbnQgMjg1IDAgUgo+PgovQ29udGVudHMgMjgyIDAgUgovVHJhbnM8PAovUyAvUmVwbGFj
ZQo+Pgo+PgplbmRvYmoKMjg2IDAgb2JqCjw8L1R5cGUvUGFnZS9NZWRpYUJveCBbMCAwIDU5NCA3
OTJdCi9Sb3RhdGUgOTAvUGFyZW50IDMgMCBSCi9SZXNvdXJjZXM8PC9Qcm9jU2V0Wy9QREYgL1Rl
eHRdCi9FeHRHU3RhdGUgMjg5IDAgUgovRm9udCAyOTAgMCBSCj4+Ci9Db250ZW50cyAyODcgMCBS
Ci9UcmFuczw8Ci9TIC9SZXBsYWNlCj4+Cj4+CmVuZG9iagoyOTEgMCBvYmoKPDwvVHlwZS9QYWdl
L01lZGlhQm94IFswIDAgNTk0IDc5Ml0KL1JvdGF0ZSA5MC9QYXJlbnQgMyAwIFIKL1Jlc291cmNl
czw8L1Byb2NTZXRbL1BERiAvVGV4dF0KL0V4dEdTdGF0ZSAyOTQgMCBSCi9Gb250IDI5NSAwIFIK
Pj4KL0NvbnRlbnRzIDI5MiAwIFIKL1RyYW5zPDwKL1MgL1JlcGxhY2UKPj4KPj4KZW5kb2JqCjI5
NiAwIG9iago8PC9UeXBlL1BhZ2UvTWVkaWFCb3ggWzAgMCA1OTQgNzkyXQovUm90YXRlIDkwL1Bh
cmVudCAzIDAgUgovUmVzb3VyY2VzPDwvUHJvY1NldFsvUERGIC9UZXh0XQovRXh0R1N0YXRlIDI5
OSAwIFIKL0ZvbnQgMzAwIDAgUgo+PgovQ29udGVudHMgMjk3IDAgUgovVHJhbnM8PAovUyAvUmVw
bGFjZQo+Pgo+PgplbmRvYmoKMzAxIDAgb2JqCjw8L1R5cGUvUGFnZS9NZWRpYUJveCBbMCAwIDU5
NCA3OTJdCi9Sb3RhdGUgOTAvUGFyZW50IDMgMCBSCi9SZXNvdXJjZXM8PC9Qcm9jU2V0Wy9QREYg
L1RleHRdCi9FeHRHU3RhdGUgMzA0IDAgUgovRm9udCAzMDUgMCBSCj4+Ci9Db250ZW50cyAzMDIg
MCBSCi9UcmFuczw8Ci9TIC9SZXBsYWNlCj4+Cj4+CmVuZG9iagozMDYgMCBvYmoKPDwvVHlwZS9Q
YWdlL01lZGlhQm94IFswIDAgNTk0IDc5Ml0KL1JvdGF0ZSA5MC9QYXJlbnQgMyAwIFIKL1Jlc291
cmNlczw8L1Byb2NTZXRbL1BERiAvVGV4dF0KL0V4dEdTdGF0ZSAzMDkgMCBSCi9Gb250IDMxMCAw
IFIKPj4KL0NvbnRlbnRzIDMwNyAwIFIKL1RyYW5zPDwKL1MgL1JlcGxhY2UKPj4KPj4KZW5kb2Jq
CjMxMSAwIG9iago8PC9UeXBlL1BhZ2UvTWVkaWFCb3ggWzAgMCA1OTQgNzkyXQovUm90YXRlIDkw
L1BhcmVudCAzIDAgUgovUmVzb3VyY2VzPDwvUHJvY1NldFsvUERGIC9UZXh0XQovRXh0R1N0YXRl
IDMxNCAwIFIKL0ZvbnQgMzE1IDAgUgo+PgovQ29udGVudHMgMzEyIDAgUgovVHJhbnM8PAovUyAv
UmVwbGFjZQo+Pgo+PgplbmRvYmoKMzE2IDAgb2JqCjw8L1R5cGUvUGFnZS9NZWRpYUJveCBbMCAw
IDU5NCA3OTJdCi9Sb3RhdGUgOTAvUGFyZW50IDMgMCBSCi9SZXNvdXJjZXM8PC9Qcm9jU2V0Wy9Q
REYgL1RleHRdCi9FeHRHU3RhdGUgMzE5IDAgUgovRm9udCAzMjAgMCBSCj4+Ci9Db250ZW50cyAz
MTcgMCBSCi9UcmFuczw8Ci9TIC9SZXBsYWNlCj4+Cj4+CmVuZG9iagozMjEgMCBvYmoKPDwvVHlw
ZS9QYWdlL01lZGlhQm94IFswIDAgNTk0IDc5Ml0KL1JvdGF0ZSA5MC9QYXJlbnQgMyAwIFIKL1Jl
c291cmNlczw8L1Byb2NTZXRbL1BERiAvVGV4dF0KL0V4dEdTdGF0ZSAzMjQgMCBSCi9Gb250IDMy
NSAwIFIKPj4KL0NvbnRlbnRzIDMyMiAwIFIKL1RyYW5zPDwKL1MgL1JlcGxhY2UKPj4KPj4KZW5k
b2JqCjMyNiAwIG9iago8PC9UeXBlL1BhZ2UvTWVkaWFCb3ggWzAgMCA1OTQgNzkyXQovUm90YXRl
IDkwL1BhcmVudCAzIDAgUgovUmVzb3VyY2VzPDwvUHJvY1NldFsvUERGIC9UZXh0XQovRXh0R1N0
YXRlIDMyOSAwIFIKL0ZvbnQgMzMwIDAgUgo+PgovQ29udGVudHMgMzI3IDAgUgovVHJhbnM8PAov
UyAvUmVwbGFjZQo+Pgo+PgplbmRvYmoKMzMxIDAgb2JqCjw8L1R5cGUvUGFnZS9NZWRpYUJveCBb
MCAwIDU5NCA3OTJdCi9Sb3RhdGUgOTAvUGFyZW50IDMgMCBSCi9SZXNvdXJjZXM8PC9Qcm9jU2V0
Wy9QREYgL1RleHRdCi9FeHRHU3RhdGUgMzM0IDAgUgovRm9udCAzMzUgMCBSCj4+Ci9Db250ZW50
cyAzMzIgMCBSCi9UcmFuczw8Ci9TIC9SZXBsYWNlCj4+Cj4+CmVuZG9iagozMzYgMCBvYmoKPDwv
VHlwZS9QYWdlL01lZGlhQm94IFswIDAgNTk0IDc5Ml0KL1JvdGF0ZSA5MC9QYXJlbnQgMyAwIFIK
L1Jlc291cmNlczw8L1Byb2NTZXRbL1BERiAvVGV4dF0KL0V4dEdTdGF0ZSAzNDEgMCBSCi9Gb250
IDM0MiAwIFIKPj4KL0NvbnRlbnRzIDMzNyAwIFIKL1RyYW5zPDwKL1MgL1JlcGxhY2UKPj4KPj4K
ZW5kb2JqCjM0MyAwIG9iago8PC9UeXBlL1BhZ2UvTWVkaWFCb3ggWzAgMCA1OTQgNzkyXQovUm90
YXRlIDkwL1BhcmVudCAzIDAgUgovUmVzb3VyY2VzPDwvUHJvY1NldFsvUERGIC9UZXh0XQovRXh0
R1N0YXRlIDM0NiAwIFIKL0ZvbnQgMzQ3IDAgUgo+PgovQ29udGVudHMgMzQ0IDAgUgovVHJhbnM8
PAovUyAvUmVwbGFjZQo+Pgo+PgplbmRvYmoKMzQ4IDAgb2JqCjw8L1R5cGUvUGFnZS9NZWRpYUJv
eCBbMCAwIDU5NCA3OTJdCi9Sb3RhdGUgOTAvUGFyZW50IDMgMCBSCi9SZXNvdXJjZXM8PC9Qcm9j
U2V0Wy9QREYgL1RleHRdCi9FeHRHU3RhdGUgMzUxIDAgUgovRm9udCAzNTIgMCBSCj4+Ci9Db250
ZW50cyAzNDkgMCBSCi9UcmFuczw8Ci9TIC9SZXBsYWNlCj4+Cj4+CmVuZG9iagozNTMgMCBvYmoK
PDwvVHlwZS9QYWdlL01lZGlhQm94IFswIDAgNTk0IDc5Ml0KL1JvdGF0ZSA5MC9QYXJlbnQgMyAw
IFIKL1Jlc291cmNlczw8L1Byb2NTZXRbL1BERiAvVGV4dF0KL0V4dEdTdGF0ZSAzNTYgMCBSCi9G
b250IDM1NyAwIFIKPj4KL0NvbnRlbnRzIDM1NCAwIFIKL1RyYW5zPDwKL1MgL1JlcGxhY2UKPj4K
Pj4KZW5kb2JqCjM1OCAwIG9iago8PC9UeXBlL1BhZ2UvTWVkaWFCb3ggWzAgMCA1OTQgNzkyXQov
Um90YXRlIDkwL1BhcmVudCAzIDAgUgovUmVzb3VyY2VzPDwvUHJvY1NldFsvUERGIC9UZXh0XQov
RXh0R1N0YXRlIDM2MSAwIFIKL0ZvbnQgMzYyIDAgUgo+PgovQ29udGVudHMgMzU5IDAgUgovVHJh
bnM8PAovUyAvUmVwbGFjZQo+Pgo+PgplbmRvYmoKMzYzIDAgb2JqCjw8L1R5cGUvUGFnZS9NZWRp
YUJveCBbMCAwIDU5NCA3OTJdCi9Sb3RhdGUgOTAvUGFyZW50IDMgMCBSCi9SZXNvdXJjZXM8PC9Q
cm9jU2V0Wy9QREYgL1RleHRdCi9FeHRHU3RhdGUgMzY2IDAgUgovRm9udCAzNjcgMCBSCj4+Ci9D
b250ZW50cyAzNjQgMCBSCi9UcmFuczw8Ci9TIC9SZXBsYWNlCj4+Cj4+CmVuZG9iagozNjggMCBv
YmoKPDwvVHlwZS9QYWdlL01lZGlhQm94IFswIDAgNTk0IDc5Ml0KL1JvdGF0ZSA5MC9QYXJlbnQg
MyAwIFIKL1Jlc291cmNlczw8L1Byb2NTZXRbL1BERiAvVGV4dF0KL0V4dEdTdGF0ZSAzNzEgMCBS
Ci9Gb250IDM3MiAwIFIKPj4KL0NvbnRlbnRzIDM2OSAwIFIKL1RyYW5zPDwKL1MgL1JlcGxhY2UK
Pj4KPj4KZW5kb2JqCjM3MyAwIG9iago8PC9UeXBlL1BhZ2UvTWVkaWFCb3ggWzAgMCA1OTQgNzky
XQovUm90YXRlIDkwL1BhcmVudCAzIDAgUgovUmVzb3VyY2VzPDwvUHJvY1NldFsvUERGIC9UZXh0
XQovRXh0R1N0YXRlIDM3NiAwIFIKL0ZvbnQgMzc3IDAgUgo+PgovQ29udGVudHMgMzc0IDAgUgov
VHJhbnM8PAovUyAvUmVwbGFjZQo+Pgo+PgplbmRvYmoKMzc4IDAgb2JqCjw8L1R5cGUvUGFnZS9N
ZWRpYUJveCBbMCAwIDU5NCA3OTJdCi9Sb3RhdGUgOTAvUGFyZW50IDMgMCBSCi9SZXNvdXJjZXM8
PC9Qcm9jU2V0Wy9QREYgL1RleHRdCi9FeHRHU3RhdGUgMzgxIDAgUgovRm9udCAzODIgMCBSCj4+
Ci9Db250ZW50cyAzNzkgMCBSCi9UcmFuczw8Ci9TIC9SZXBsYWNlCj4+Cj4+CmVuZG9iagozODMg
MCBvYmoKPDwvVHlwZS9QYWdlL01lZGlhQm94IFswIDAgNTk0IDc5Ml0KL1JvdGF0ZSA5MC9QYXJl
bnQgMyAwIFIKL1Jlc291cmNlczw8L1Byb2NTZXRbL1BERiAvSW1hZ2VDXQovRXh0R1N0YXRlIDM4
NyAwIFIKL1hPYmplY3QgMzg4IDAgUgo+PgovQ29udGVudHMgMzg0IDAgUgovVHJhbnM8PAovUyAv
UmVwbGFjZQo+Pgo+PgplbmRvYmoKMzg5IDAgb2JqCjw8L1R5cGUvUGFnZS9NZWRpYUJveCBbMCAw
IDU5NCA3OTJdCi9Sb3RhdGUgOTAvUGFyZW50IDMgMCBSCi9SZXNvdXJjZXM8PC9Qcm9jU2V0Wy9Q
REYgL1RleHRdCi9FeHRHU3RhdGUgMzkyIDAgUgovRm9udCAzOTMgMCBSCj4+Ci9Db250ZW50cyAz
OTAgMCBSCi9UcmFuczw8Ci9TIC9SZXBsYWNlCj4+Cj4+CmVuZG9iagozOTQgMCBvYmoKPDwvVHlw
ZS9QYWdlL01lZGlhQm94IFswIDAgNTk0IDc5Ml0KL1JvdGF0ZSA5MC9QYXJlbnQgMyAwIFIKL1Jl
c291cmNlczw8L1Byb2NTZXRbL1BERiAvVGV4dF0KL0V4dEdTdGF0ZSAzOTcgMCBSCi9Gb250IDM5
OCAwIFIKPj4KL0NvbnRlbnRzIDM5NSAwIFIKL1RyYW5zPDwKL1MgL1JlcGxhY2UKPj4KPj4KZW5k
b2JqCjM5OSAwIG9iago8PC9UeXBlL1BhZ2UvTWVkaWFCb3ggWzAgMCA1OTQgNzkyXQovUm90YXRl
IDkwL1BhcmVudCAzIDAgUgovUmVzb3VyY2VzPDwvUHJvY1NldFsvUERGIC9UZXh0XQovRXh0R1N0
YXRlIDQwMiAwIFIKL0ZvbnQgNDAzIDAgUgo+PgovQ29udGVudHMgNDAwIDAgUgovVHJhbnM8PAov
UyAvUmVwbGFjZQo+Pgo+PgplbmRvYmoKNDA0IDAgb2JqCjw8L1R5cGUvUGFnZS9NZWRpYUJveCBb
MCAwIDU5NCA3OTJdCi9Sb3RhdGUgOTAvUGFyZW50IDMgMCBSCi9SZXNvdXJjZXM8PC9Qcm9jU2V0
Wy9QREYgL1RleHRdCi9FeHRHU3RhdGUgNDA3IDAgUgovRm9udCA0MDggMCBSCj4+Ci9Db250ZW50
cyA0MDUgMCBSCi9UcmFuczw8Ci9TIC9SZXBsYWNlCj4+Cj4+CmVuZG9iago0MDkgMCBvYmoKPDwv
VHlwZS9QYWdlL01lZGlhQm94IFswIDAgNTk0IDc5Ml0KL1JvdGF0ZSA5MC9QYXJlbnQgMyAwIFIK
L1Jlc291cmNlczw8L1Byb2NTZXRbL1BERiAvVGV4dF0KL0V4dEdTdGF0ZSA0MTIgMCBSCi9Gb250
IDQxMyAwIFIKPj4KL0NvbnRlbnRzIDQxMCAwIFIKL1RyYW5zPDwKL1MgL1JlcGxhY2UKPj4KPj4K
ZW5kb2JqCjMgMCBvYmoKPDwgL1R5cGUgL1BhZ2VzIC9LaWRzIFsKNCAwIFIKNjggMCBSCjczIDAg
Ugo3OSAwIFIKODYgMCBSCjkzIDAgUgo5OCAwIFIKMTAzIDAgUgoxMDggMCBSCjExMyAwIFIKMTE4
IDAgUgoxMjMgMCBSCjEyOCAwIFIKMTM1IDAgUgoxNDIgMCBSCjE0NyAwIFIKMTUyIDAgUgoxNTkg
MCBSCjE2NCAwIFIKMTY5IDAgUgoxNzUgMCBSCjE4MCAwIFIKMTg1IDAgUgoxOTAgMCBSCjE5NSAw
IFIKMjAwIDAgUgoyMDggMCBSCjIxMyAwIFIKMjE5IDAgUgoyMjQgMCBSCjIyOSAwIFIKMjM0IDAg
UgoyMzkgMCBSCjI0NCAwIFIKMjUxIDAgUgoyNTYgMCBSCjI2MSAwIFIKMjY2IDAgUgoyNzEgMCBS
CjI3NiAwIFIKMjgxIDAgUgoyODYgMCBSCjI5MSAwIFIKMjk2IDAgUgozMDEgMCBSCjMwNiAwIFIK
MzExIDAgUgozMTYgMCBSCjMyMSAwIFIKMzI2IDAgUgozMzEgMCBSCjMzNiAwIFIKMzQzIDAgUgoz
NDggMCBSCjM1MyAwIFIKMzU4IDAgUgozNjMgMCBSCjM2OCAwIFIKMzczIDAgUgozNzggMCBSCjM4
MyAwIFIKMzg5IDAgUgozOTQgMCBSCjM5OSAwIFIKNDA0IDAgUgo0MDkgMCBSCl0gL0NvdW50IDY2
Ci9Dcm9wQm94IFswIDAgNTk0IDg0Ml0KPj4KZW5kb2JqCjYgMCBvYmoKPDwgL0NvdW50IDUyIC9G
aXJzdCA3IDAgUiAvTGFzdCA1NyAwIFIgPj4KZW5kb2JqCjEgMCBvYmoKPDwvVHlwZSAvQ2F0YWxv
ZyAvUGFnZXMgMyAwIFIKL091dGxpbmVzIDYgMCBSCi9EZXN0cyA1IDAgUgovT3BlbkFjdGlvbiBb
NCAwIFIgL0ZpdF0KL1BhZ2VNb2RlL1VzZU5vbmUKL1BhZ2VMYWJlbHM8PAovTnVtcyBbMCA8PAov
UCAoMSkKPj4gMSA8PAovUCAoMikKPj4gMiA8PAovUCAoMykKPj4gMyA8PAovUCAoNCkKPj4gNCA8
PAovUCAoNSkKPj4gNSA8PAovUCAoNikKPj4gNiA8PAovUCAoNykKPj4gNyA8PAovUCAoOCkKPj4g
OCA8PAovUCAoOSkKPj4gOSA8PAovUCAoMTApCj4+IDEwIDw8Ci9QICgxMSkKPj4gMTEgPDwKL1Ag
KDEyKQo+PiAxMiA8PAovUCAoMTMpCj4+IDEzIDw8Ci9QICgxNCkKPj4gMTQgPDwKL1AgKDE1KQo+
PiAxNSA8PAovUCAoMTYpCj4+IDE2IDw8Ci9QICgxNykKPj4gMTcgPDwKL1AgKDE4KQo+PiAxOCA8
PAovUCAoMTkpCj4+IDE5IDw8Ci9QICgyMCkKPj4gMjAgPDwKL1AgKDIxKQo+PiAyMSA8PAovUCAo
MjIpCj4+IDIyIDw8Ci9QICgyMykKPj4gMjMgPDwKL1AgKDI0KQo+PiAyNCA8PAovUCAoMjUpCj4+
IDI1IDw8Ci9QICgyNikKPj4gMjYgPDwKL1AgKDI3KQo+PiAyNyA8PAovUCAoMjgpCj4+IDI4IDw8
Ci9QICgyOSkKPj4gMjkgPDwKL1AgKDMwKQo+PiAzMCA8PAovUCAoMzEpCj4+IDMxIDw8Ci9QICgz
MikKPj4gMzIgPDwKL1AgKDMzKQo+PiAzMyA8PAovUCAoMzQpCj4+IDM0IDw8Ci9QICgzNSkKPj4g
MzUgPDwKL1AgKDM2KQo+PiAzNiA8PAovUCAoMzcpCj4+IDM3IDw8Ci9QICgzOCkKPj4gMzggPDwK
L1AgKDM5KQo+PiAzOSA8PAovUCAoNDApCj4+IDQwIDw8Ci9QICg0MSkKPj4gNDEgPDwKL1AgKDQy
KQo+PiA0MiA8PAovUCAoNDMpCj4+IDQzIDw8Ci9QICg0NCkKPj4gNDQgPDwKL1AgKDQ1KQo+PiA0
NSA8PAovUCAoNDYpCj4+IDQ2IDw8Ci9QICg0NykKPj4gNDcgPDwKL1AgKDQ4KQo+PiA0OCA8PAov
UCAoNDkpCj4+IDQ5IDw8Ci9QICg1MCkKPj4gNTAgPDwKL1AgKDUxKQo+PiA1MSA8PAovUCAoNTIp
Cj4+IDUyIDw8Ci9QICg1MykKPj4gNTMgPDwKL1AgKDU0KQo+PiA1NCA8PAovUCAoNTUpCj4+IDU1
IDw8Ci9QICg1NikKPj4gNTYgPDwKL1AgKDU3KQo+PiA1NyA8PAovUCAoNTgpCj4+IDU4IDw8Ci9Q
ICg1OSkKPj4gNTkgPDwKL1AgKDYwKQo+PiA2MCA8PAovUCAoNjEpCj4+IDYxIDw8Ci9QICg2MikK
Pj4gNjIgPDwKL1AgKDYzKQo+PiA2MyA8PAovUCAoNjQpCj4+IDY0IDw8Ci9QICg2NSkKPj4gNjUg
PDwKL1AgKDY2KQo+Pl0KPj4KL01ldGFkYXRhIDQyNSAwIFIKPj4KZW5kb2JqCjcgMCBvYmoKPDwg
L1RpdGxlKCkKL0Rlc3Qvc2xpZGUuMgovUGFyZW50IDYgMCBSCi9OZXh0IDggMCBSCj4+CmVuZG9i
ago4IDAgb2JqCjw8IC9UaXRsZSgpCi9EZXN0L3NsaWRlLjMKL1BhcmVudCA2IDAgUgovUHJldiA3
IDAgUgovTmV4dCA5IDAgUgo+PgplbmRvYmoKMTAgMCBvYmoKPDwgL1RpdGxlKCkKL0Rlc3Qvc2xp
ZGUuNQovUGFyZW50IDkgMCBSCi9OZXh0IDExIDAgUgo+PgplbmRvYmoKMTEgMCBvYmoKPDwgL1Rp
dGxlKEMpCi9EZXN0L3NsaWRlLjYKL1BhcmVudCA5IDAgUgovUHJldiAxMCAwIFIKL05leHQgMTIg
MCBSCj4+CmVuZG9iagoxMiAwIG9iago8PCAvVGl0bGUoQysrKQovRGVzdC9zbGlkZS43Ci9QYXJl
bnQgOSAwIFIKL1ByZXYgMTEgMCBSCi9OZXh0IDEzIDAgUgo+PgplbmRvYmoKMTMgMCBvYmoKPDwg
L1RpdGxlKEphdmEsIEMjKQovRGVzdC9zbGlkZS44Ci9QYXJlbnQgOSAwIFIKL1ByZXYgMTIgMCBS
Ci9OZXh0IDE0IDAgUgo+PgplbmRvYmoKMTQgMCBvYmoKPDwgL1RpdGxlKEdvKQovRGVzdC9zbGlk
ZS45Ci9QYXJlbnQgOSAwIFIKL1ByZXYgMTMgMCBSCi9OZXh0IDE1IDAgUgo+PgplbmRvYmoKMTUg
MCBvYmoKPDwgL1RpdGxlKCkKL0Rlc3Qvc2xpZGUuMTAKL1BhcmVudCA5IDAgUgovUHJldiAxNCAw
IFIKL05leHQgMTYgMCBSCj4+CmVuZG9iagoxNiAwIG9iago8PCAvVGl0bGUoQykKL0Rlc3Qvc2xp
ZGUuMTEKL1BhcmVudCA5IDAgUgovUHJldiAxNSAwIFIKL05leHQgMTcgMCBSCj4+CmVuZG9iagox
NyAwIG9iago8PCAvVGl0bGUoQysrKQovRGVzdC9zbGlkZS4xMgovUGFyZW50IDkgMCBSCi9QcmV2
IDE2IDAgUgovTmV4dCAxOCAwIFIKPj4KZW5kb2JqCjE4IDAgb2JqCjw8IC9UaXRsZShDKyspCi9E
ZXN0L3NsaWRlLjEzCi9QYXJlbnQgOSAwIFIKL1ByZXYgMTcgMCBSCi9OZXh0IDE5IDAgUgo+Pgpl
bmRvYmoKMTkgMCBvYmoKPDwgL1RpdGxlKEphdmEsIEMjKQovRGVzdC9zbGlkZS4xNAovUGFyZW50
IDkgMCBSCi9QcmV2IDE4IDAgUgovTmV4dCAyMCAwIFIKPj4KZW5kb2JqCjIwIDAgb2JqCjw8IC9U
aXRsZShHbykKL0Rlc3Qvc2xpZGUuMTUKL1BhcmVudCA5IDAgUgovUHJldiAxOSAwIFIKL05leHQg
MjEgMCBSCj4+CmVuZG9iagoyMSAwIG9iago8PCAvVGl0bGUoKQovRGVzdC9zbGlkZS4xNgovUGFy
ZW50IDkgMCBSCi9QcmV2IDIwIDAgUgovTmV4dCAyMiAwIFIKPj4KZW5kb2JqCjIyIDAgb2JqCjw8
IC9UaXRsZShZZXN0ZXJkYXkpCi9EZXN0L3NsaWRlLjE3Ci9QYXJlbnQgOSAwIFIKL1ByZXYgMjEg
MCBSCi9OZXh0IDIzIDAgUgo+PgplbmRvYmoKMjMgMCBvYmoKPDwgL1RpdGxlKCkKL0Rlc3Qvc2xp
ZGUuMTgKL1BhcmVudCA5IDAgUgovUHJldiAyMiAwIFIKL05leHQgMjQgMCBSCj4+CmVuZG9iagoy
NCAwIG9iago8PCAvVGl0bGUoKQovRGVzdC9zbGlkZS4xOQovUGFyZW50IDkgMCBSCi9QcmV2IDIz
IDAgUgovTmV4dCAyNSAwIFIKPj4KZW5kb2JqCjI1IDAgb2JqCjw8IC9UaXRsZShFbnRlciBEKQov
RGVzdC9zbGlkZS4yMAovUGFyZW50IDkgMCBSCi9QcmV2IDI0IDAgUgovTmV4dCAyNiAwIFIKPj4K
ZW5kb2JqCjI2IDAgb2JqCjw8IC9UaXRsZShCdXQgd2FpdCwgdGhlcmUncyBtb3JlIFwob2YgdGhl
IHNhbWVcKSkKL0Rlc3Qvc2xpZGUuMjEKL1BhcmVudCA5IDAgUgovUHJldiAyNSAwIFIKL05leHQg
MjcgMCBSCj4+CmVuZG9iagoyNyAwIG9iago8PCAvVGl0bGUoVGhyZWUncyBhIGNoYXJtKQovRGVz
dC9zbGlkZS4yMgovUGFyZW50IDkgMCBSCi9QcmV2IDI2IDAgUgovTmV4dCAyOCAwIFIKPj4KZW5k
b2JqCjI4IDAgb2JqCjw8IC9UaXRsZShFeGFtcGxlKQovRGVzdC9zbGlkZS4yMwovUGFyZW50IDkg
MCBSCi9QcmV2IDI3IDAgUgovTmV4dCAyOSAwIFIKPj4KZW5kb2JqCjI5IDAgb2JqCjw8IC9UaXRs
ZSgpCi9EZXN0L3NsaWRlLjI0Ci9QYXJlbnQgOSAwIFIKL1ByZXYgMjggMCBSCi9OZXh0IDMwIDAg
Ugo+PgplbmRvYmoKMzAgMCBvYmoKPDwgL1RpdGxlKCkKL0Rlc3Qvc2xpZGUuMjUKL1BhcmVudCA5
IDAgUgovUHJldiAyOSAwIFIKL05leHQgMzEgMCBSCj4+CmVuZG9iagozMSAwIG9iago8PCAvVGl0
bGUoKQovRGVzdC9zbGlkZS4yNgovUGFyZW50IDkgMCBSCi9QcmV2IDMwIDAgUgo+PgplbmRvYmoK
OSAwIG9iago8PCAvVGl0bGUoMS4gVGhlIHNjb3BlIFN0YXRlbWVudDpDYXN1YWwgQ29ycmVjdCBD
b2RlKQovRGVzdC9zbGlkZS40Ci9Db3VudCAyMiAvUGFyZW50IDYgMCBSCi9QcmV2IDggMCBSCi9O
ZXh0IDMyIDAgUgovRmlyc3QgMTAgMCBSIC9MYXN0IDMxIDAgUgo+PgplbmRvYmoKMzMgMCBvYmoK
PDwgL1RpdGxlKCkKL0Rlc3Qvc2xpZGUuMjgKL1BhcmVudCAzMiAwIFIKL05leHQgMzQgMCBSCj4+
CmVuZG9iagozNCAwIG9iago8PCAvVGl0bGUoKQovRGVzdC9zbGlkZS4yOQovUGFyZW50IDMyIDAg
UgovUHJldiAzMyAwIFIKL05leHQgMzUgMCBSCj4+CmVuZG9iagozNSAwIG9iago8PCAvVGl0bGUo
KQovRGVzdC9zbGlkZS4zMAovUGFyZW50IDMyIDAgUgovUHJldiAzNCAwIFIKL05leHQgMzYgMCBS
Cj4+CmVuZG9iagozNiAwIG9iago8PCAvVGl0bGUoRCBhcnJheSA9IHBvaW50ZXIgKyBsZW5ndGgp
Ci9EZXN0L3NsaWRlLjMxCi9QYXJlbnQgMzIgMCBSCi9QcmV2IDM1IDAgUgovTmV4dCAzNyAwIFIK
Pj4KZW5kb2JqCjM3IDAgb2JqCjw8IC9UaXRsZSgpCi9EZXN0L3NsaWRlLjMyCi9QYXJlbnQgMzIg
MCBSCi9QcmV2IDM2IDAgUgovTmV4dCAzOCAwIFIKPj4KZW5kb2JqCjM4IDAgb2JqCjw8IC9UaXRs
ZShDaGVhcCwgdHlwZS1wcmVzZXJ2aW5nIHNsaWNpbmcpCi9EZXN0L3NsaWRlLjMzCi9QYXJlbnQg
MzIgMCBSCi9QcmV2IDM3IDAgUgovTmV4dCAzOSAwIFIKPj4KZW5kb2JqCjM5IDAgb2JqCjw8IC9U
aXRsZShDb252ZW5pZW50KQovRGVzdC9zbGlkZS4zNAovUGFyZW50IDMyIDAgUgovUHJldiAzOCAw
IFIKL05leHQgNDAgMCBSCj4+CmVuZG9iago0MCAwIG9iago8PCAvVGl0bGUoR2VuZXJhbGl6YXRp
b24pCi9EZXN0L3NsaWRlLjM1Ci9QYXJlbnQgMzIgMCBSCi9QcmV2IDM5IDAgUgovTmV4dCA0MSAw
IFIKPj4KZW5kb2JqCjQxIDAgb2JqCjw8IC9UaXRsZShQYWxpbmRyb21lIGdlbmVyYWxpemVkKQov
RGVzdC9zbGlkZS4zNgovUGFyZW50IDMyIDAgUgovUHJldiA0MCAwIFIKPj4KZW5kb2JqCjMyIDAg
b2JqCjw8IC9UaXRsZSgyLiBCdWlsdC1pbiBBcnJheXMpCi9EZXN0L3NsaWRlLjI3Ci9Db3VudCA5
IC9QYXJlbnQgNiAwIFIKL1ByZXYgOSAwIFIKL05leHQgNDIgMCBSCi9GaXJzdCAzMyAwIFIgL0xh
c3QgNDEgMCBSCj4+CmVuZG9iago0MyAwIG9iago8PCAvVGl0bGUoKQovRGVzdC9zbGlkZS4zOAov
UGFyZW50IDQyIDAgUgovTmV4dCA0NCAwIFIKPj4KZW5kb2JqCjQ0IDAgb2JqCjw8IC9UaXRsZShF
bWJlZGRlZCBEU0xzKQovRGVzdC9zbGlkZS4zOQovUGFyZW50IDQyIDAgUgovUHJldiA0MyAwIFIK
L05leHQgNDUgMCBSCj4+CmVuZG9iago0NSAwIG9iago8PCAvVGl0bGUoRW1iZWRkZWQgRFNMcykK
L0Rlc3Qvc2xpZGUuNDAKL1BhcmVudCA0MiAwIFIKL1ByZXYgNDQgMCBSCi9OZXh0IDQ2IDAgUgo+
PgplbmRvYmoKNDYgMCBvYmoKPDwgL1RpdGxlKEVtYmVkZGVkIERTTHMpCi9EZXN0L3NsaWRlLjQx
Ci9QYXJlbnQgNDIgMCBSCi9QcmV2IDQ1IDAgUgovTmV4dCA0NyAwIFIKPj4KZW5kb2JqCjQ3IDAg
b2JqCjw8IC9UaXRsZShFeHByZXNzaW9uIHBhcnNlcikKL0Rlc3Qvc2xpZGUuNDIKL1BhcmVudCA0
MiAwIFIKL1ByZXYgNDYgMCBSCi9OZXh0IDQ4IDAgUgo+PgplbmRvYmoKNDggMCBvYmoKPDwgL1Rp
dGxlKEhvdyBkb2VzIGl0IHdvcms/KQovRGVzdC9zbGlkZS40MwovUGFyZW50IDQyIDAgUgovUHJl
diA0NyAwIFIKL05leHQgNDkgMCBSCj4+CmVuZG9iago0OSAwIG9iago8PCAvVGl0bGUoSG93IGRv
ZXMgaXQgd29yaz8pCi9EZXN0L3NsaWRlLjQ0Ci9QYXJlbnQgNDIgMCBSCi9QcmV2IDQ4IDAgUgov
TmV4dCA1MCAwIFIKPj4KZW5kb2JqCjUwIDAgb2JqCjw8IC9UaXRsZShTdGF0aWMgdXNlIG9mIGV4
cHJlc3Npb24gcGFyc2VyKQovRGVzdC9zbGlkZS40NQovUGFyZW50IDQyIDAgUgovUHJldiA0OSAw
IFIKL05leHQgNTEgMCBSCj4+CmVuZG9iago1MSAwIG9iago8PCAvVGl0bGUoRHluYW1pYyB1c2Ug
b2YgZXhwcmVzc2lvbiBwYXJzZXIpCi9EZXN0L3NsaWRlLjQ2Ci9QYXJlbnQgNDIgMCBSCi9QcmV2
IDUwIDAgUgovTmV4dCA1MiAwIFIKPj4KZW5kb2JqCjUyIDAgb2JqCjw8IC9UaXRsZShTY2FsaW5n
IHVwKQovRGVzdC9zbGlkZS40NwovUGFyZW50IDQyIDAgUgovUHJldiA1MSAwIFIKL05leHQgNTMg
MCBSCj4+CmVuZG9iago1MyAwIG9iago8PCAvVGl0bGUoKQovRGVzdC9zbGlkZS40OAovUGFyZW50
IDQyIDAgUgovUHJldiA1MiAwIFIKL05leHQgNTQgMCBSCj4+CmVuZG9iago1NCAwIG9iago8PCAv
VGl0bGUoKQovRGVzdC9zbGlkZS40OQovUGFyZW50IDQyIDAgUgovUHJldiA1MyAwIFIKL05leHQg
NTUgMCBSCj4+CmVuZG9iago1NSAwIG9iago8PCAvVGl0bGUoSW50ZWdyYXRlZCBzdGF0aWMvZHlu
YW1pYyBlbmdpbmUpCi9EZXN0L3NsaWRlLjUwCi9QYXJlbnQgNDIgMCBSCi9QcmV2IDU0IDAgUgov
TmV4dCA1NiAwIFIKPj4KZW5kb2JqCjU2IDAgb2JqCjw8IC9UaXRsZSgpCi9EZXN0L3NsaWRlLjUx
Ci9QYXJlbnQgNDIgMCBSCi9QcmV2IDU1IDAgUgo+PgplbmRvYmoKNDIgMCBvYmoKPDwgL1RpdGxl
KDMuIENvbXBpbGUtdGltZSBldmFsdWF0aW9uIGFuZCBtaXhpbikKL0Rlc3Qvc2xpZGUuMzcKL0Nv
dW50IDE0IC9QYXJlbnQgNiAwIFIKL1ByZXYgMzIgMCBSCi9OZXh0IDU3IDAgUgovRmlyc3QgNDMg
MCBSIC9MYXN0IDU2IDAgUgo+PgplbmRvYmoKNTggMCBvYmoKPDwgL1RpdGxlKFN1bW1hcnkpCi9E
ZXN0L3NsaWRlLjUzCi9QYXJlbnQgNTcgMCBSCj4+CmVuZG9iago2MSAwIG9iago8PC9UeXBlL0V4
dEdTdGF0ZQovT1BNIDE+PmVuZG9iago2NiAwIG9iago8PC9SNjEKNjEgMCBSPj4KZW5kb2JqCjY3
IDAgb2JqCjw8L1I2NQo2NSAwIFIvUjYyCjYyIDAgUi9SNjMKNjMgMCBSPj4KZW5kb2JqCjcxIDAg
b2JqCjw8L1I2MQo2MSAwIFI+PgplbmRvYmoKNzIgMCBvYmoKPDwvUjYyCjYyIDAgUi9SNjMKNjMg
MCBSPj4KZW5kb2JqCjc3IDAgb2JqCjw8L1I2MQo2MSAwIFI+PgplbmRvYmoKNzggMCBvYmoKPDwv
Ujc2Cjc2IDAgUj4+CmVuZG9iago3NiAwIG9iago8PC9TdWJ0eXBlL0ltYWdlCi9Db2xvclNwYWNl
L0RldmljZVJHQgovV2lkdGggMTk0Ci9IZWlnaHQgMjAwCi9CaXRzUGVyQ29tcG9uZW50IDgKL0Zp
bHRlci9EQ1REZWNvZGUvTGVuZ3RoIDYxNDU+PnN0cmVhbQr/2P/uAA5BZG9iZQBkAAAAAAH/2wBD
AA4KCw0LCQ4NDA0QDw4RFiQXFhQUFiwgIRokNC43NjMuMjI6QVNGOj1OPjIySGJJTlZYXV5dOEVm
bWVabFNbXVn/2wBDAQ8QEBYTFioXFypZOzI7WVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZ
WVlZWVlZWVlZWVlZWVlZWVlZWVn/wAARCADIAMIDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAA
AAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKB
kaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZn
aGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT
1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcI
CQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAV
YnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6
goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk
5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD0miiigAoopKAFpKKKACilpKAFopKWgAooooAK
KKKACiikoAbJIkSF5GCKOSWOAKyH8VaJHndqMIwcHnNcF4+8Rvf6idMtZSLWI4k2nG9u/wCArHsr
GC8xFb/ZGcH/AFbE7m/GgD0uXxvoEYz9uVz6KpNZ8nxH0ZD8qXL/AEQf41xN9o0qWzJFpW2U/wDL
RJNw/AU3TfCk8rK98whjP8KnLH/CgD0Gx8faJdvtaV7cnp5q4H6V00FxFcRh4ZFkQ9CpyK8sk0/Q
LW2MU7oQpJJL/PVe3vn0NVvdEuGnsgcSxMTwfXHagD2CisLw54ktNdtwYXxMo+eM9RW5QAtFFFAB
RRRQAUUlLQAlLSUUALSUtFACUtJRQAtFFFABRRRQAVk+I9STStFubh2w23ag9WPArVNeafFK4kku
rCzUnZgsQO5oA5SDSZHu7dHmV5rqYICjbuD1JrvG+H/2MebpN/JFOP8AnoAwaszwPp+nrqqzT38T
zW4KwwgbeT1OT1r03NAHlmqS+I9OQQvY7pOhmjG5W+npWfFD4o1BGVleCEjDSSYRR+Nervqmno4R
723VicAGQZzWV4wtoNQ8K3hUiQRoZFKnuKAPJtU0+200hGvY7y5P3lhOUT/gXerWiWV5BA91K4gs
GU+YXGdw9APWnaLpunC2F/e3SkJyYh1/GoNf1v8AtJlitw0dsv8ACe59aAKNjfSabqK3VpIUKPkY
7jPQ171pt2t/p9vdR/dmQOPxr54r2b4dXJuPC0KsctE7J+GeKAOrooooASlpDS0AJS0lLQAlLSUU
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
HS0kKpDGcbsdv/r12PiW7W00G+cuofyWCgnvjtWd4CSODwvar5qFpSXIzzyaAOG+Igit9UtLC3AW
K0gCqvpnmuPrd8ZXJuvFN8/919n5cVh0AArd8MeHbjxBeiNMpbRkGWTHAHoPes/StMuNWv47O1Qt
I569lHcmvc9D0mDRdNis7ccKPmbuzdzQBNp1hb6bZR2tqgSKMYA9ferdFJQAUtFFABRRRQAhpaKK
ACiiigAooooAKKKKAEqvfwy3FjPDDII5JEKq5H3Se9FFAFDw3oa6FpYtBL5zli7ybcbia1+aKKAG
Sb/Lby9u/Hy7uma4y7uPHMEhKWllMmeDGQf5kGiigCppng+61ae7u/EhkWSQ/Ikb4A960rDwFY2N
5DcRXVyfKfcFLcGiigCzeeBtFvLmS4lilEkjF2KvjJNQD4e6EGH7uf6eZRRQBuaVoen6OhWyt1jJ
6t1Y/jWlRRQAUUUUAJQKKKAFooooA//ZCmVuZHN0cmVhbQplbmRvYmoKODQgMCBvYmoKPDwvUjYx
CjYxIDAgUj4+CmVuZG9iago4NSAwIG9iago8PC9SODIKODIgMCBSL1I2NQo2NSAwIFIvUjYyCjYy
IDAgUi9SNjMKNjMgMCBSPj4KZW5kb2JqCjkxIDAgb2JqCjw8L1I2MQo2MSAwIFI+PgplbmRvYmoK
OTIgMCBvYmoKPDwvUjg5Cjg5IDAgUi9SODIKODIgMCBSL1I2Mgo2MiAwIFIvUjYzCjYzIDAgUj4+
CmVuZG9iago5NiAwIG9iago8PC9SNjEKNjEgMCBSPj4KZW5kb2JqCjk3IDAgb2JqCjw8L1I4OQo4
OSAwIFIvUjgyCjgyIDAgUi9SNjIKNjIgMCBSL1I2Mwo2MyAwIFI+PgplbmRvYmoKMTAxIDAgb2Jq
Cjw8L1I2MQo2MSAwIFI+PgplbmRvYmoKMTAyIDAgb2JqCjw8L1I4OQo4OSAwIFIvUjgyCjgyIDAg
Ui9SNjIKNjIgMCBSL1I2Mwo2MyAwIFI+PgplbmRvYmoKMTA2IDAgb2JqCjw8L1I2MQo2MSAwIFI+
PgplbmRvYmoKMTA3IDAgb2JqCjw8L1I4OQo4OSAwIFIvUjgyCjgyIDAgUi9SNjIKNjIgMCBSL1I2
Mwo2MyAwIFI+PgplbmRvYmoKMTExIDAgb2JqCjw8L1I2MQo2MSAwIFI+PgplbmRvYmoKMTEyIDAg
b2JqCjw8L1I4OQo4OSAwIFIvUjgyCjgyIDAgUi9SNjUKNjUgMCBSL1I2Mgo2MiAwIFIvUjYzCjYz
IDAgUj4+CmVuZG9iagoxMTYgMCBvYmoKPDwvUjYxCjYxIDAgUj4+CmVuZG9iagoxMTcgMCBvYmoK
PDwvUjg5Cjg5IDAgUi9SODIKODIgMCBSL1I2NQo2NSAwIFIvUjYyCjYyIDAgUi9SNjMKNjMgMCBS
Pj4KZW5kb2JqCjEyMSAwIG9iago8PC9SNjEKNjEgMCBSPj4KZW5kb2JqCjEyMiAwIG9iago8PC9S
ODkKODkgMCBSL1I4Mgo4MiAwIFIvUjY1CjY1IDAgUi9SNjIKNjIgMCBSL1I2Mwo2MyAwIFI+Pgpl
bmRvYmoKMTI2IDAgb2JqCjw8L1I2MQo2MSAwIFI+PgplbmRvYmoKMTI3IDAgb2JqCjw8L1I4OQo4
OSAwIFIvUjgyCjgyIDAgUi9SNjUKNjUgMCBSL1I2Mgo2MiAwIFIvUjYzCjYzIDAgUj4+CmVuZG9i
agoxMzIgMCBvYmoKPDwvUjYxCjYxIDAgUj4+CmVuZG9iagoxMzMgMCBvYmoKPDwvUjEzMQoxMzEg
MCBSPj4KZW5kb2JqCjEzMSAwIG9iago8PC9TdWJ0eXBlL0ltYWdlCi9Db2xvclNwYWNlL0Rldmlj
ZVJHQgovV2lkdGggMzAxCi9IZWlnaHQgMTkwCi9CaXRzUGVyQ29tcG9uZW50IDgKL0ZpbHRlci9E
Q1REZWNvZGUvTGVuZ3RoIDExNzgxPj5zdHJlYW0K/9j/7gAOQWRvYmUAZAAAAAAB/9sAQwAOCgsN
CwkODQwNEA8OERYkFxYUFBYsICEaJDQuNzYzLjIyOkFTRjo9Tj4yMkhiSU5WWF1eXThFZm1lWmxT
W11Z/9sAQwEPEBAWExYqFxcqWTsyO1lZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZ
WVlZWVlZWVlZWVlZWVlZ/8AAEQgAvgEtAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAAB
AgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNC
scEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0
dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY
2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//E
ALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoW
JDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWG
h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp
6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A5LZskLRo+B0KtmkdnYASSbs9BItSKqxvlFByuDtfvipc
skfztKvOMMuRXLc7LGZLEfmKou3/AGTTDGAo3bsY7jNXp8MjbPLI+m2onjKR/IG5H8LZq1IzcCqI
14+YYPvikCtvHXk1Jt4BY8HoGWgLgcAfUNVXIsR5OcHa1JwOzD3qVSemG69SM0AruGNufyouFiJe
p+Yd/vClQsGyM59FqTZx3IPsDTTGo749Oop3Cwwn+9/LFOBOeM/TrRsYcj/GlwxHKg0gJxKSpDYx
+tWbDUWsILtIokIuVVWLDO3BzkVQBGfm3LSqfRgfTtS2He+50VnesNPfy2fyUK8yNu8s84x6Ac13
du4ltoX5yU5weB6ivKOTHyDhhxxmuu8J6s0yzWV05aQsZI/VuOV/rSB6nQLu86aJcnOGX6/5/lSS
yPEockbFYZCn+E//AK6ZcMWQN0kH3SO1RpLHLvSRAAw5H8/w9KgpIJ7mVLWVQeU+9hQeSP8A61Oa
dvILAgnZuwBnnB/Wi3TzY2hkyCRsOe5/hP4j9aYY2bT4VRW3yqqfL9Of5GptqV0HxzSukKvJ/wAs
w55HLHPX9Ka672JAV8cDB71NIBFluCRgKPYd6SOLA3ug9x049T6UwRbt9+3y1Y8Lyj9GPpXH+IJB
/acjlljRfkUjkn3/AJ11GpX6adprTn5s8RK/Xd/hXB7OTLgFupPr+NDKige8mO4xIEDDDHpuz1+v
PNQtGzDLnI/75H+NTKce5HUAZ/WlUAEA45xn+I0rlWGrHsO0D5O+OF/+vT4VAVsHOf7tObbjD/gW
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
mugzx/LtzgDHf60XEdtJ4ntvuqj7vzNUz4htzIVlVowB8rt1NcjbsfPkkHAUdM1Iga4jJdvvcj/Z
pOTBHYr4i047PLdS2PvmrMFzZyFijBl9c1xEFsIEkXh93HzCq1xJ9hmQJna4z8pwRRuPZnokl/aw
x/w55wfQ1k6j4ltbf7uZMYxt9a5FLiW5UgN8h5w3WpkCWbrlfMZhkk9qadgZov4lnmi/cxBBnq3X
6VD9vvzMvm3DcngjgH2phdWjyEGG5qsbpnhJwM5xQ2I0ZriZx81xNjuoaqLTSS/IbiUdtucGot0s
sWA4DA9cVBEyl1k25ZjgE9vWkBNJPLanaLiUc5X5s49vfNWIrufz32XEu7Azk/pVHJ+0FGOWHIam
2ZzcTf8ATM0xGx/al7FGJGnwuMkN1oi13e4eUHDf3ehrImIuFdmH+r4x2NFg7ZYnB2DK+1BVup0s
OsQyyBcjOcdM4qxmA/NGwZ24II6e9cbJMFm3qNpz2qSK/ljdgrse/NHKF7nVRyYlbzOR2JGOak2h
lRyV+XhlPQ+9cb/alzLOERyGB6mrQS4nUb5yMHsKqyFc6xZIWXayhUXkMp4/GqzTxbyqsuSeOMDF
c55UkaFftEu3rjNQCFRMQWcsf4t1KwXZ1UN2m/h9suOoGOPSrK6hdDI39PbNcE05V2KlvlbAyc1c
kvZoiF8xjSsFz//ZCmVuZHN0cmVhbQplbmRvYmoKMTM0IDAgb2JqCjw8L1I2Mgo2MiAwIFI+Pgpl
bmRvYmoKMTQwIDAgb2JqCjw8L1I2MQo2MSAwIFI+PgplbmRvYmoKMTQxIDAgb2JqCjw8L1I4OQo4
OSAwIFIvUjgyCjgyIDAgUi9SNjUKNjUgMCBSL1I2Mgo2MiAwIFIvUjYzCjYzIDAgUi9SMTM4CjEz
OCAwIFI+PgplbmRvYmoKMTQ1IDAgb2JqCjw8L1I2MQo2MSAwIFI+PgplbmRvYmoKMTQ2IDAgb2Jq
Cjw8L1I4OQo4OSAwIFIvUjgyCjgyIDAgUi9SNjUKNjUgMCBSL1I2Mgo2MiAwIFIvUjYzCjYzIDAg
Ui9SMTM4CjEzOCAwIFI+PgplbmRvYmoKMTUwIDAgb2JqCjw8L1I2MQo2MSAwIFI+PgplbmRvYmoK
MTUxIDAgb2JqCjw8L1I4OQo4OSAwIFIvUjgyCjgyIDAgUi9SNjUKNjUgMCBSL1I2Mgo2MiAwIFIv
UjYzCjYzIDAgUi9SMTM4CjEzOCAwIFI+PgplbmRvYmoKMTU3IDAgb2JqCjw8L1I2MQo2MSAwIFI+
PgplbmRvYmoKMTU4IDAgb2JqCjw8L1I4OQo4OSAwIFIvUjgyCjgyIDAgUi9SNjUKNjUgMCBSL1I2
Mgo2MiAwIFIvUjE1NQoxNTUgMCBSL1I2Mwo2MyAwIFI+PgplbmRvYmoKMTYyIDAgb2JqCjw8L1I2
MQo2MSAwIFI+PgplbmRvYmoKMTYzIDAgb2JqCjw8L1I4OQo4OSAwIFIvUjgyCjgyIDAgUi9SNjUK
NjUgMCBSL1I2Mgo2MiAwIFIvUjYzCjYzIDAgUi9SMTM4CjEzOCAwIFI+PgplbmRvYmoKMTY3IDAg
b2JqCjw8L1I2MQo2MSAwIFI+PgplbmRvYmoKMTY4IDAgb2JqCjw8L1I2Mgo2MiAwIFIvUjYzCjYz
IDAgUj4+CmVuZG9iagoxNzMgMCBvYmoKPDwvUjYxCjYxIDAgUj4+CmVuZG9iagoxNzQgMCBvYmoK
PDwvUjE3MgoxNzIgMCBSPj4KZW5kb2JqCjE3MiAwIG9iago8PC9TdWJ0eXBlL0ltYWdlCi9Db2xv
clNwYWNlL0RldmljZVJHQgovV2lkdGggMTU2NAovSGVpZ2h0IDczOQovQml0c1BlckNvbXBvbmVu
dCA4Ci9GaWx0ZXIvRENURGVjb2RlL0xlbmd0aCA5ODE0Nj4+c3RyZWFtCv/Y/+4ADkFkb2JlAGQA
AAAAAf/bAEMADgoLDQsJDg0MDRAPDhEWJBcWFBQWLCAhGiQ0Ljc2My4yMjpBU0Y6PU4+MjJIYklO
VlhdXl04RWZtZVpsU1tdWf/bAEMBDxAQFhMWKhcXKlk7MjtZWVlZWVlZWVlZWVlZWVlZWVlZWVlZ
WVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWf/AABEIAuMGHAMBIgACEQEDEQH/xAAfAAABBQEB
AQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYT
UWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZX
WFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPE
xcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAA
AQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGh
scEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlq
c3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV
1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/APSaKKKACiiigAooooAKKKKACiii
gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA
CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK
KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo
ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii
gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA
CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigApjntTqjJyaAFQd6kpAMClo
AKY57U6oicmgAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigCaiiigBGG5SMkZGM
jtXlJ8Sa1Z6iY7i9kcQS7XUgc4PI6e1er15R43tPsviSdgMLOolH48H9QaAPVlYMoZTkEZBpayvD
N19s8PWMpOSIwh+q/L/StWgDE8W6lJpmhSywPsndljjYdiTk/oDXni+KdaVgft8hwc4IHP6VvfEi
83XFnZKeEUysPc8D+R/OsXWNI+x+H9IvNuGmVvMP1O5f0/lQB6razrdWsNxH9yVA6/QjNS1zfgW8
+1eHY4ycvbsYj9Oo/Q4/CukoAyvEt82naDdXEbbZQu1D3DE4z+ua5Lwdquraprix3F5JJBGjO6nG
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
UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR
QAUUUUAFFFFABRRRQAUUUjHAoAjY5NPUYFMAyaloAKKKaxwKAGMcmkoooAKKKKACiiigAooooAKK
KKACiiigAooooAKKKKACiiigAooooAKKKKAJqKKKACiiigAooooAKKKKACiiigAooooAKKKKACii
igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK
ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA
KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo
oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDN8Rf8i9qP/Xu/
8q898B/8jNF/1zf+Vep0AAdAKAFooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo
oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAqNz2p9RdTQA9B
3p9IBgUtABUbnnFPPAqI8mgAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo
AKKKKAJqKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA
CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK
KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo
ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii
gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA
CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAY
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
gD2qtdS+K7HTX1WW5s5PLTzZbIQ4CqOSA+c5A/yaAOvorB1LxCtt4ROt20PmbokdEbsWIHP0J5+l
VdPi8R3UdveDWrGSGTa7RR24K7e4DdaAOllkSGJ5JGCoilmY9AB1NR2d3BfWsdzayCSGQZVwOtY/
iqHVZLC4exu4IbZbd/NR4txbg5we3FYnhS18Qv4esHtNStIrUp8sbwbmAye9AHdVk2+tx3euz6ba
wvKtsmZ7gEbI37J7nr9Mfk/xHqDaXoF7eJ9+KM7PZjwP1Iqv4R05dN8O2idZpkE0zHqzsMnP8vwo
Ata3qbaRpzXgtZLlI2HmCMjKp3b3x/n1q3a3MN5axXNtIJIZVDIw7ipWUMpVgGUjBB6EVyXhDOna
vrWhZPk2somgB/hRxnH4ZH5mgDrqKKKAK97dw2FnNd3LbIYVLsfaqGh6xLq6tKdNuLS2KhopJiB5
gPsOlZ3j28tx4avLMTIbubYkcAYF2Jdei9eldFaRmKzgjYYKRqpHpgUATUUUUAFFFFABRRRQAUUU
UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ
AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB
RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUjHApaj
c84oARRk1LTEHGafQAU1jgU6o3POKAG0UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR
RQAUUUUAFFFFABRRRQBNRRRQAUUUUAFcnqn/ACUfQ/8Ar3l/k1dZSbQWBwMjoaAIryNprOeJfvPG
yj6kVw/hbxNZaX4Zg0+VZW1SBnjFmsbb3YsSAOPeu+pgijEhkCL5hGN2OfzoA4Lw+GHwy1UOMMFu
cj0ODXQaH/yItr/14/8AstbwVQCAowe2KUAAYAGPSgDiNEsZNS+FaWkP+tkik2D1IkYgfjip9E8Y
6TbaRb2upTNZXdrGsUsMkbZBUYyMD2rsAAowAAPQU1oo3YM0asw6EjJFADbadLq1huIsmOVA65GD
gjI4rhvCeu6foFnd6Zq8xtLqG5c7XRvmB6EYFd9THijkILxoxHQsoOKAKd5rFhY6fFfXVwI7WXbs
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
PmA6jrwa6a1kMtpDI33nRWP1Iqrrum/2vot3Yb9hmTAY9iDkfqBVXw82sJALXVrSGPyEVEnil3CX
HHTqKANqiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig
AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC
iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK
KKACiiigAooooAKKKKAEPAqLqae54xSIOc0APHApaKKAEJwKip7ntTKACiiigAooooAKKKKACiii
gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAJqKKKACiiigAooooAKKKKACiiigAoooo
AKKKKACiiigAooooAKKK526vrm78YWum2kzR29pEZ7sr/Fn7iH+f0NAHRUUVz0d9c3/jKS2t5mWx
06H9+F6SSt0B+g5+ooA6GiiigAorD8U6xcaRZW4sYo5r26nWGGN84JPXoR/k1L4Y1c65ocN5IqpM
SUlRc4Vgff8AA/jQBr0VFcXMFrEZbmaOGMfxyMFH5mmWt7a3qlrS5huFXqYpAwH5UAWKKgubu2s4
/MuriKBDxulcKPzNLbXdveR+Za3EU6dN0Thh+YoAmoqrdalY2Tql3e21uzfdWWVVJ/M1YEiNGJA6
lCMhgeMeuaAHUVTl1TT4YY5pb+1jik+47TKFb6HPNTSXVvFbieWeJITgiRnAXnpz0oAmormtL8U2
91q+q29zdWUVvauiwP5oHmAg5OScHoOldDBPFcRCWCVJY26OjBgfxFAElFFQXN3bWiq11cQwKxwD
I4UH86AJ6K5rw74pt9SsZpr+6sraRZ2RU80L8oxg8n9aPGWoz2ekWdxYXBQy3Ua70IIZDn9DQB0t
FVf7Rsftf2T7Zb/aenk+au//AL5zmrLMFUsxAUDJJ7UALRVS21OwvJGjtb22nkXqsUqsR+ANW6AC
iimsyopZiFUDJJOAKAHUVTt9U0+6l8q2vrWaT+5HMrH8ganuLmC1iMtzNHDGOryMFH5mgCWiq9re
2t6he0uYbhBwWicMB+VK95bRtKHuIVMIDSBnA2A9CfSgCeiq9pe2t7GXtLmG4QHBaJw4B/CiS+tI
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
2shICt/eTAPPt/8AWxb1QeIVuw2knTXtioBS53hg3cgr+FAFXw1f6DeTzjSrWOyu1X99CYRE4Ge4
HB5ro65zSNEvl1yXWtXmtjdtD5KRWykIq5zkk8k10dABXE+FbC116XUtX1SCO7ne6eFFmUOsaLjA
APHeu2rlBoms6PqF3NoE9k1rdyGV7e7DAI56lStAEGiQJo/ju/0yzyllPai5EQPEb5A49Op/Suej
1a6sZNXtLZvsi3urSxPfP92AZ/n7/wCR22g6JPZXl1qWpXCXOpXQCs0Ywkajoq+3T8qg03w0Et9a
t9SEU0GoXTzKqE5Ck8dRwR7UAami6RaaLYLbWi/L955Dy0jd2Jrlzc+HbmW5Fj4bn1RTI3mXEVqH
UsTzh2Ofyrb8PaZqOm2k2n31xFdWa5W3kBPmBP7rDGOnvWVpeh+JNItDplleactkHYpcOjGVAT/d
6E/WgBngWBb/AMKahYTh/s/2mWBUf7yIQOPqCT+NM8Pay2k+E9SgvCPtWjM8WD/Fz8n4E8fhW34U
0WfQrG6t7iZZjLdPMrgkkqQAM8DnjmuY13TE1P4gR2drJmKdEk1BF6AIeM+5G0fiKAOl8F6c2neH
LcS5+0XGbiYnqWbnn8MCt+krm5dG1d/GceppqO3TVUA2+5v7uCNvQ5POaAOlooooAKKKKACiiigA
ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi
iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACo3POKeTgVF1NAD0HGafSUtABUbnJp
5OBUVABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB
NRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRTWdExuZVz6nFKrBhlSCPUUALRR
RQAUUUUAFFFFABRVXUNRtNMtvtF9OsEOQu5vU9qsRussayRsGRwGVgcgg96AHUUUUAFMkQSRtG33
WBU/Q1WvtUstOkgS8uY4WuG2RBj94/5I/OrlAFPStOt9J0+KytAwgiztDHJ5JJ5+pq5Sbhu25GcZ
xS0AFFFIzBRliAPU0ALRSUKwYZUgj1FAC0UVWvr62061a5vJVhgTAZ26DJwKALNFZ2ma3p2rNIun
3aXBjALhQeM9OtaNABRRRQAUUUUAFFFFABRRRQAUUUUAFFVo7+1lvprKOZWuYVDSR85UHpTNR1Oy
0uFZr+4SCN2CKzdzQBcopAQQCDkHoRS0AFFFFABRSMQqlicADJrIs/E+jX11HbWt/HLNIcKgByeM
+lAGxRRRQAUUUUAFFFRC4hMnliWMyf3dwz+VAEtFFIrBhlSCPUUALRRRQAUUhIAJJwB3oBBGRyDQ
AtFFFABRRRQAUUhIAyeAKqabqdpqsMk1lJ5sUchjL4IBI64Pce4oAuUVTOp2Q1E2BnX7WE8wxYOd
vrS6dqNpqlv9osZ1niDFdyg4yPrQBbopruka7pGVF9WOBQjq6hkYMp6EHIoAdRRRQAUUUUAFFFFA
BRRRQAUUUUAFFIGDDKkEeopaACiqenapZaokj2NzHcLG2xih6GrlABRRRQAUUUUAFFFIWC4yQMnH
NAC0UUUAFFFFABRRWf8A21p2+8T7Um6yGbgYP7se/FAE2o2Meo2MlpM0ixyYyY22sMEHg/hVfSNE
sNFidLGHYZDl3Ylmc+5NW7S6gvbWO5tpBLDIMq46EVPQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ
AUUUUAFFFFABRSFgvUgZOOaWgAoqpqOo2ml232i+nWCHcF3N3J7VZR1kRXRgyMMgg8EUAOooooAK
KKTpQAtFMWSNjhXUn0Bp9ABRRRQAUUUUAFFFFABRRRQAUVWvb+10+ON7uZYlkcRqTnlj0H6VYJCg
liABySe1AC0VT07U7PVIGmsLhJ41YoWXsR2q5QAUUUUAFFFZeoeIdK0y5+z317HBNtDbWBzg/QUA
alFRW88V1bxzwOHilUMjDuD0NS0AFFFFABRSUisrjKsGHsc0AOopAwJIBBI64PSloAKKKKACiiig
BjnjFIg5zSE5NSKMCgBaKKSgBrntTKUnJpKACiq1/f2um232i9mWGHIXc2cZP0pg1SyN/HZC4X7V
InmLHg5K+v6UAXKKKKACiiigAooooAKKKKACiqZ1OzF+9iZ1+1InmNHg5C+tO0/ULXUrf7RZTLNF
kruXOMj60AWqKpx6paSapLpyy4u4kDshBGQe49fwq5QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB
NRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAHF+L7OC/8V+HLW6jEkEhmDISRngH
tVbXdLtvC17pd7ofmW0k10sElusjMsynrwSfp+NWPGNs154q8O26XEtszmYCWE4deB0Na+n+FrW1
vkvbm5vNQuo/9XJdy7/L/wB0dqAE1/xNFoV/YwT27yR3QkO5DlgVHAC45JJA6iq0Xia+h1Kzt9V0
drGC+fy4ZPODkN2DAdM5FReIgD438MggHmY8/wC6K6a4tLe6MRuII5TE4kjLqDtYdCPQ0AZGreIH
tdRTTNNsm1DUGTzGjDhFjX1Zj0/z7UzTPEU0mrDStW09tPvXUvF+8DpKB1wR3/wrP06aOy+ImsR3
bLG93FE8DOcbwBggf57UuuSx3/jfQba0ZZJrQyTTlDny1wOD9cfqPWgDV/t4w+JRpF7beQJl3W0/
mZWb1HQYPt/iKWz103+v3NhaW3mW1qMTXRfAD/3AMcn8fX8cfxu66nPZaJZIH1R5BMsoJH2ZR/GS
On+fap/AlzDFp8ukPCLbULJyLiMnlyT9/PfPH6dsUAR+Mr6eK1uFvfDyX2lQlH85rsJk8DO0DcOT
iums3Q6dA8cYjQxKyoOijHArC8fTRf8ACIajH5ib8J8u4Z++vatfTZY30m3VJEYi3XIBBx8ooA5e
Lx8ZLO2vm0xksWlENxN5ufKck8AY+bAAJ+uK1tE8Rzajq82n3WntZyCEXEW5wxaMkDkdjyOK4pAP
+FZabwOdQGff5mrqoP8AkqFz/wBgwf8Aoa0AVfEN/KNQsjq/huN4FuxFbXDXYPJPB2gZ5Azg+ldd
fS3ENnJJaW32qdR8kO8JuP1PArl/Hk8TW+kBZUJGpREgMOOGrrUkSQExurgf3TmgDz2w1HWl8aar
NHoYkunhjElv9rQeWMDB3Ywc11cuq6jb+H7nULnShFcwAt9m+0BtyjGTuA9MnGO1ZNjNHb/EnVkm
dYzNbRmPccbsBc4/z2rrAY50YApIhyrAHI+lAFXT9TgvtHh1JSEhki8w5P3OOQfpz+Vcd4j1d9c+
HdzfNa/ZkeZRGC+4socDd0GOc8e1Zst1PpGnar4UjJNxLdLFaZ7xS8n9Ovu1b/jazj0/4ftaQ/6u
ARIPfDDmgDek1Ow/s5x9uts+URjzV9PrWF4O1C30v4ewXt0xWGLzCcdT+8OAPcnir0nhXQhYM40y
33CInOO+K5B4pJPhHatGCVinLyYGfl8xh/MigDppfE+q21quoXegPHpxwWdZw0iKejFMfpXTRPDe
WscqbZYZVDqSMhgeQa5b+yZ9U0xj/wAJVNNZzxkMfLjwVI5B9K6HTLaLS9JtbYTh4oYwiyMQNw7U
Ac/oCqnjvxGqKFULBgAYH3a0/EniGPw+lnJNCZIp5fLZg2CgxnIGOfpWVok8I8d+I2MsYVlhwSww
flp3jdkF34dZyoQajGSSeMZFACyeLL6ze3n1PRJLPTp3CCdpgWTPQsvatjXdaj0iKACF7m6uX8uC
3Q4MjfXsB61jfEG4hm0AafEyy3d5LGkMSnLE7gc49OOvvVLxdFJB4j8PyvetZQhHh+1BQRG+Pfjn
Pf39KANaPxHe2uoW1trel/Yku22QzJMJE39lOBxU/iHxLFoN5YRTwNJHdeZl0PzKVAwAuOSSQOoq
hd+G5r4W4vvEc08SSrLGrRxgFh0wR9aPE4B8YeFgQD+8mPP0WgCRPE99BqFnFqujPZW16/lwymYO
Qx6BgOmava3rr6feW1hZ2bXuoXILJEHCKFHUlj+P5VqXNpb3fl/aYI5vKcSJvUHaw6Ee9ZOvaLZ6
tcQObx7PUIBmGaGQK6g+3cf/AF6AJtJvdXuLh49T0pLOMLuWVLgSBjnpgciteuR0bUtTtPE39h39
3DqSNCZVuEUK6Y7MBx/+sc10Grara6NYNeXrlIlIHAyST0AFAF6ufvvEM41OXTtI05tRuYADMfME
ccWegLHqfatewvYNRsYbu1ffDKu5TjFcv4SnittZ8SQXMiRzi8aU7zglDnB57f40AReGZ7q48c6z
Je2n2S4MEQaLzA+MAY5HXI5pfGWoTQwSHU/Dkd3psEoKTNdhcnoDtAyOuKPDd9BqPjvW7m1YvC0M
aq+OGxgEj2yDU3xHmibwncIJELiRPlDDP3qAOtUAKAAAMcAdq5t/Ed/d391b6JpX2xLSQxSzSTiN
d46gDv8AWuiiljkX93Ij4HO0g4rmLvQF+23Oo6FrJ0+eVi0ygh4nbuSvY5z60AbtjdXcunGe+svs
lwu7MPmh+nQ5HrXOWHjC/wBYs1l0nQ3uJFBM26YKiHJwoYj5jjB9s1d8Maxc6zod294sfnW8jwmS
L7kmB94fnVb4f3NvB4LtmlmijEZkLlmA2/Oev4UAbPh/WYtd037THG0Lq5jlifrG46isTXYo4/G/
hny0VMmbO0Yz8op3gQeZDq+oAFba7vpJYc8ZXPX/AD6UzxBPC3jXw0wljKqZskMMD5RQB1kztHBJ
IqGRlUsEXqxA6CuYufEOvWds95c+HNlpGNz4u1Z1XucAVr67qh03QbvULcLM0KZUZyM5xzjtzXJ3
/wBqfwo+oah4nbNzbFhBGiKjFl+4BjJ64oA6LVfEa2Xh6DWba2N1bSFCw3bSiN36HkHAxWhqGpwW
OjzakSHhji81cHG/jgD68fnWT4ds49Q8B2lnMP3c9sUPtnPNclBdT6npmneE5iRcx3jQ3OP+eMfP
/wCr/doA3PFOp39x4Itr1IpbQXLobgRNuaOE574HX5fzxVnTPDXhO/tY5rCCKdVwQ6TNuB9+cg+x
rpZpba3jSOaSGJH+RVdgA3HQZ68Vw/i7TdK0e0bVtJuF0/UUZfLW3cAS5IyNv054/GgDoPFV3qUF
hcR2emC6ge3fzJvtCp5fB/hPJ45rE8KalrkXh6wittAFxbhMLN9sRNwyedpGRXT3hmuPDU5kj2zy
WbFkA6MU5H51m+B7y2bwjYgTx5jUq4LAFTuPWgDW1a8u7O3RrHT2v5nfb5YkCADBOST24/WseLxJ
f2up2lnrWk/Y1vH8uGaOYSLu7A46UvivVry0vdL06ynS0a/kZWuXUN5YGOgPGTmue8QRG11rQ4Jt
cl1Cf7dExhcL8g3D5uBx+NAGl8QbvUhol/bDTAbAiPN59oXj5lP3OvXj9a0dI1LXJBZxTaAIbYqo
af7YjYXHXbjP4Uvj5WfwZqIUEnCHj0DqTWppV5bT6XZvFPGyvEgXDDk4HH1oAgbWdvihNG8j71t9
o87f/tEYxj265ovNZ+zeItP0ryN32xHbzd+Nm0E9Mc9PWse6kSD4nWrSsEWXTyiFjgFt7HFQXt/b
XnxK0aK2lWVreOZZCvIBKNxn1oA2NY16W01OHTNPsWvr+SPzdnmCNUTOMkn+VWdIvNVuJJU1PTFs
goBR0nEgf1GB0qnrmh2mqX0VxFfvY6nAu1JYXAbaexHcdaqeHtU1JfENzomo3MN/5MPmrcxKFI5A
2sBxnn/9dAEnjS5meGy0e1cxzapL5TOOqxjG8/qPwzXQWVpDYWcVrbII4YlCqo9K5nxGfs/jTw1c
yf6otLFnsGYYH8/0rraAMP8AsST/AITBtYLx+SbXyNnO7dnr6YxSeFdHfw9oZtbiWN2V2kLJnGD9
fYVu1HNGJYZIycB1K5+ooA4jQdLj8X+drWtb54XlZLW23kJGg4zx3/wrp9K0TTtD+0NYRmCObBdS
5KjGeeTx1rnvAOoQ2enS6LeyJb31nM6mN2wWBOcjPXkn9K6LU5Y7/SdTtrKeOW4+zuu2NwSpZSFz
jpQBkR+J9S1AST6LojXlkjFRNJOI/Nx12gitDTvEMGo6Hc6hDE6vbK/mwPwyOoyVP+NU/BGoWbeE
7RRNHGbZCkyswBQgnOfT1rK0L/SLHxbqEQP2S6eXyW6BsK2WH1yKALdv4v1DUbAXelaFJcRRrmZm
mCgN1KrkZbH0rVj8RRT+FH1yCEsixNJ5TNg5XgjP1HWovBQA8G6f/wBc2/8AQjXOaJ/ySW7/AOuc
38zQBp/8JfqFxp/9o2GhST2Mab5ZXmCdB820YyQOefat1dbszoC6w7lLQxCU5HI9vrnj61SsQB4A
g/7Bg/8ARdcxdwyzfCC38oE7AHYD+6JDn/H8KANt/E+qxWY1KbQJF03G8uJ1Mqp/eKY/St6TVbOL
SP7UeYCz8sS7/VT049faudh0yfVNL3p4qmltJ49rDyo8bSOQfT0qHxVpbWfw6+x2kjXEduEYv/eT
dnPHbnP4UAXIPEWt3kIu7Pw3JJZtyjPcqjuvqFIq54lvNSgsZVstL+1xPA/myG4WPyuPQ9eKv2Wq
6fc6dHdQXMAtygOS4AQY6H0xUmpqZNKu1Qbi0LgAd/lNAHG+EtS1yHw3Yx2mgC6t1U7ZvtiJuG4/
wkZFdfqtzfW1uj6dp4v5S2GjMwiwMHnJ/Dj3rF8B3lsfCFkvnxhogyuCwBU7j1rpZJY4wDI6oD03
HFAHNeCZ7aWDUEt9KTTHhuTHLGkvmZcdecfoOKsa94mTRNRs7V7SSf7SjFTGctuHRQuOckgdaz/B
M0S3XiDMqDdqUhXLDnntUmtc/EHw5n/nnP8A+gGgCa18SX0esWtjq+kmwF5nyJBMJASOxx3/AMat
61rr2F9badZWjXuoXILLFvCKqj+Jm7dD+VZ3i7/kP+GP+vs/+y1R8R3EkfjuzeyntbW7hsyWe8fb
FKpY4T68k/8A6qAL0PibVv7eh0i40NI53AcsLsY2Z5YfLzjnjrxXWVy2jWM99r51jUb2xmnii8qG
GzfckYPUknknk/nXU0AFeeeKL/WH1nRfO0URGK7JgH2pW888YHT5fx9a9DrkfGsiwan4cuJWCQx3
o3uei5x1/I0Aa+lX2r3Vw6ajowsIgmVkF0suTkcYA+vPtVK58R3c+o3FloemG/a1O2eVpRGit/dB
PU10CTRSMFSRGJGcBgePWuS8BzxWyarp9w6pexXsjurHBYHGG9xx/nNAGtoOvjVZrm0uLV7LULUj
zbd23YB6EHuK264/TJEv/iLqF3aMHt4LRYJJF5VnLA4z36H8q7CgArl/+EZm+0eJJPNixqsWyLr8
h2kfNx6kdK6iigDP0KwfS9FtLKRlZ4IwrMvQn2rQoooAKx5tYePxVb6QIVKS2xnMmeQQSMY/Crup
WbX1k9ul1PaMxB82BsOMHsa4S40GZfHNpZnWdRZ3s2cXBk/eKMn5QfSgD0aiqOlWD6datDJe3N6S
5bzLhtzDgcfTj9avUAZ2v6n/AGNo1zqHk+d5IB2btucsB1wfWsKbxdetZvqNjokk+mxDLzvKELAd
SqkZIHrVzx7/AMibqP8Aup/6Gtamnwxy6HawyRq0T2yoyEcEFQCMelAFa88Q2dpoUWqne8U6qYo1
HzuzDhQPX/A1mS+JtR07yp9Z0U2ljIwUzJOJDFnpuAFU/HtstrY6M8B+y2lrdpuaNARCOzAdOOan
vNAm1PTmjuvFEs1nKAT8ke1gCCOR7gUAbet61Bo9rHI6PPNO4jghi5aVj0A/xrGuvE+r6e9t/aGg
rBFczLCji7Vtpb1AHpn8qh8Qqun+I/Cslw/+iwl4jI3ADbQAT6dvyqPx3qVrJcaRYRyiS4F9FKwX
kIvI59Cc/pQB0N/rP2PXdM03yN/27f8AvN+Nm0Z6Y5o1nWf7LvNMt/I837dOId2/bs6c9OetY/iW
RLfxn4ammYJFmZdzHAyVAH8xVfxZqFrN4m8PWcUyyTxXivIqnOwEjGff2oA3da1z+zri3srW1e91
C5yY4FYLwOrMT0FV7HxDcjVotM1jTjY3E6loHWUSJJjqM9j/AJ9Kw9ejlT4g27NqL6ctxZ7Ipwqk
EhuU+bgf/XHrWp/wjkkup2Fxe69LdPbSeZFGyIuT1I4+lAF3WteksdQt9NsbJr7UJ0Mix7wiqo7l
j9D+VTaTeatcTSJqelpZqq5WRLgSBj6YHIqvrui2eq3cMovXstSgX93LDIA4U+o7jr+tUND1PU4P
Esmh6hdQ6iqwectzGoVl5xhgOP8AI9aAMrxXf6u+raOJdGEQivgbf/SlPnkEYHT5c+/rXV6Vf6vd
XLJqOjCwhCEiQXSy5bI4wB9efasjxw6wXnh64lISGK/Qu56KOOv5GuqSaKQgJKjEjIAYHI9aAOT8
Z308VrcC+8PJe6VCyMJmuwmScDO0DcOWxXVWjK1nAyII0MalUHRRjpXO/ECaI+D9RjEib/3fy7hn
/WL2rd0yWOSwtgkiMREuQCDjgUAc5B4uu7+e6tdM0d7i7t5njcGYKiqDgMWI6k549q1fDuuf21Bc
CW2a1u7WQxTws27afY9x/hWZ4D/1etn/AKicv9KTwqceIvFB9LlTx9GoAkTxLqGoPcyaLo/2y0t3
KGV5xGZGHUKMUuka9ca/ot/cSaeLSFY3VW88OWYA5BGARjjr61znhe+1CHTZhpd7pENtNNI0cN5M
RLBk45A68YNdVpWlR6P4Vnt47gXLPHJLJMOjsRyR7UAYHhLwno2qeFLO5urU/aZA+ZlkZWBDsARz
joB2rU8EajK2gXjX1yZYbGeSNbhzndGoByT371leEfDf9peF7OWbVtSjglD5toptseN7DGMdDj9a
6DXdLjtfBd9YabD5aJA21F6nHJ+pPNAFVfE+qXFq2oWWgvNpwyVdpwsjqOrBMf8A662LfXLGfQhq
4kK2nlmQlhyuOox654rmvDlpdX2hWklp4nmSNYlUxLFGfKIGCvTPHvSazoY034cXllZXDXSIwl3D
HIDgt09ME/hQBdbxPqosv7S/sCT+zMb9/nr5uz+/sx6c4rV1DXYbbw0+s2yfaIRGsiLu27gSB1wc
daxLDT7jU9Ijkh8UzNbSRAFRFHhQRgqfT0p2t6fHpXw2ubKGczxxR/LIcfMDID2+tADpPF17JZPq
Fhoklxp0S7pJ3lCZA+9tBGSBzz7V0un3kWoWEF5Bnyp0DrnqM9jUGlRRyeH7KF0VomtUVkI4IKjI
xVu3gitYEht40iiQYVEGAB7CgCWszXNZg0W0SWVHmllcRwwxjLSOegFM0rxFpur3lza2UxeW3+8C
pAIzjI9Rmsbxa62/iXw1dXBC2qTSKzN91WIGM/57UAZfiy/1e5ttOTUNHFlCb6JlkFyshzz8pAHu
fyrstXuL+3hT7Bpq6gzkh0M6xhRj361zPj/UrV/7MsI5RJcfbI5WVedijI59M54rtJJY4seZIqZ6
bjjNAHO+B57WfSrr7JpqacI7p43iWTzMsAuTn8cfhVzXdc/sqS1toLV7y+vGKwwqwUHHUlj0HNZH
w/miWx1RTIgZtSlwCwyeFrW8QaRY6v8AZ0uLlrW7hJeCWKQLInrj24FAC6Xfa1Pd+VqOkJawlSRM
lyr8+mOv41T1XxV/Z2unSksJbmdoQ8IjbmRicbcY4GMnOe1U9P1DVdL8T2ui3t9FqkNyjMsgULJF
gE/Njtx3p4dE+KEnmMq500BdxxzvHT9aALem+IrqTWV0rV9NNhcyoZISJRIsgHUZHfg/lVnxZFG3
hrU3aNC4tnwxHI4rJ1aSPUPHmiQWjCR7JZZZ2Q5CAgAA/l+orW8WTRDw1qiGRA/2Z/lLDPSgCTwt
/wAivpX/AF6x/wDoIqLUtS1mK9eDTtF+0xoAfPkuFjUkjoAeTTvCssbeGtLRZELi1jyoIyPlFYsd
9qGua9qtsuq/2Xa6e/lhI0Uu/XLEt0HH60AbGg682qy3drcWbWd/aECWFn3DnoQR1FO8Oa5/bdvc
mS3+y3FtM0MsJfdtI75wPf8AKud8HMj+MNbMd82oKI4x9obHz4AB6ccdPwp2q3a+FPF1xfMMWepW
zMR285Bkfn/NqANyHWzqGpavYRW/7ixj2tcb/vOR93GO3PftXH/Dq5k0ye2gmY/ZdWR2iJ6LKjEE
fioH6V03hOwez8KNNPzdXoe5lJ6ksMj9MfrXP6Zp8l78M7Se14vLGR7mBh1yrsSPxH64oA2vCn/I
z+Kf+viP/wBmqxNrPiEGSSDw3ugQnG+6UO4HcLjj6Vj+CdTW6ufEupohKuY5tg6/dYkf0p2mXV7q
2jf2xf8AiT7BExb91CiBYgCRgk8k8frQBsv4qhbwjJr1vbtIqYDQs20htwUjOD65qj/wmkv2xIf7
KkK3ce+xIkG6c7sDIx8oPXJ7Vz9oQfhNqZB3Aznk9/3iVtOB/wAJl4XGBgWT49vkNAGxo/iOO90m
8vL2L7G1jI8dwm7cFK9cHvVBvE+qmyOpJoDnTcbw5nUSlP72zHpzisBoZZ/Cfi9IQSw1F2IHoHUn
9Aa1tOsbjUtHhkg8UTNbvEAUEUeFGOVPpjpQB1Wn3cOoWcN3btuhlUOp9quVmeHdNj0nRbezhnM8
ce7bIccgsT2+tadABWLpmsvf6vq1i0KoLF0VWByX3Ann06VY1jS5NTWIR6jeWPlkkm2fbuzjr+Vc
TomhTXHiHXoF1jUYjBJGDKkmGlyG5Y98YoA9CoqG0gNtaxQtNJOY1CmSQ5Zvc+9TUAY3irSJdc0S
SygdI5GZWDPnAwfamNocn/CV2+rK6CGK08jZzuLZPP0wa3KKACiiigAoqtqN9b6ZYy3l2+yGIZY4
z3wP1Ipml6lbatYpeWbl4XyBkYII6gigC5RVLVdTtdIsXu7xysSkDgZJJ6ACpbC9g1Gyiu7V98Mo
ypxigCxRWfrOsWeiWgub52VGYIoVckn/ACDVu2uIru2iuIG3xSqHRvUHpQBkjRH/AOEtl1ZnQwva
+Rs53bsjn0xgUvhTR5dD0VLKeRJJA7MWTOOT71tUUAcz41s3Wxj1i0+S+05hIrD+JM/Mp9sc/n61
vWN0l9Y291H9yeNZAPQEZql4omSDwxqbyEBTbunPqwwP1IpPC8LweGdNjkBDCBSQe2Rn+tAFfWvE
Eul6vp9klhLcLdtgyKfu84445I61vVlanr9hpV9a2l3IyS3JwmFyBzjk9ua1aACiiigAooooAKKK
KACiiigAooooAmooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigCrPYWtzd291NCrz
22fKck5TPWrVFFAFWewtbi8t7qaFXnts+U5JymetWqKKAKGp6Pp+rxqmoWsc4X7pbgr9CORRpmj6
fpCMmn2kcAb7xXkn6k8mr9FAFO30yztb2e8hgVbm4/1kmSWb86G0uybUl1EwL9sVdglBIOPQ+v41
cooAxrvwvot7dSXNzp8ck0hyzktkn86n03QdM0qR5LC0SB5F2sVJ5Hpya0qKAM0aFpg0+OxFon2W
N/MSPJwG656+9WBYWq6i1+IVF20flGTJyVznH6VaooAwn8H6BI7O2mxFmOSdzcn860NN0mx0mJ47
C3WBHO5gpJyfxq7RQBnapoemauUOoWcc7IMKxyGA9MjnFRMtj4Y0lja2cv2dWz5VupdiTxnBNa1F
AHHaVYXGt+KD4gvrJ7OCCPy7WKVcSN1+dh26n9PSuov7G21G1a2vIhNAxBKHODg5HSrNFADSimMo
R8pG3HtVe00+0srEWdtAiWwBHl9Rg8nr9TVqigDAbwZ4eaUyHTItxOcBmA/LOK0rzS7K+sls7q3S
S2TG2M5AGOnSrtFAGB/whnh7/oGRf99N/jVHxpp/2t9BtxbtNbi+RZFVSQE6HOOgxXW0UAZWneHd
I0ubzrKwiil7PyzD6E5xV28s7a/t2t7yCOeFuqOMirFFAGHaeEtCsrlLi309EmjYMrF2O0joRk1p
XFha3N1bXM8KvPbEmJyTlM9f5VaooAKy9U8P6VrEqy6hZrPIq7QxZgQOuOCPU1qUUAZ+maLp2kKw
0+0jg3feYcsfqTzU+oWFrqVo1rewrNA2Mq3/ANbpVmigCG1tobO2jt7aNYoYxtRF6AVQ1Hw7pOqX
K3F9YxzTKMbzkEj3wefxrVooAqW+m2drctcW9ukUrIsZKjHyjoMdOKz7jwpod1cSTz6dG8srF3Yl
uSep61t0UAZ+maLp2kGQ6fapbmXG/aSc4zjqfc1Rn8HaBcXDTy6cjSOxZiHYZJ9gcVvUUAVVtYbT
T2t7WFIolQhUjXAHHpXH+DvCmmXHh+1n1LTAbzL7vNDA/eOMr9Mdq7qigCI28JtjbeWogKbPLUYG
3GMcVi/8IZ4e/wCgZF/303+Nb9FAFO10yys7A2VvbolqcgxdVOevWqFt4T0K1laSHTYVdgQSSWxn
rjJ4/CtuigDIvr228OWFvFDY3UsQ+SOK1jLkd/WsvwvpNw+rX3iDUrYW1zefLFAesacdfc4H6+td
XRQBS1LS7LVoFhv7dJ41O4Bs8H8KpWXhTQ7CdZ7bTollU5VmJfB9RuJxW1RQAVhy+EtBluTcPpsP
mk7iVJAz9AcVuUUAU9S0uy1a3EF/bJPGDkBuoPsRyKqW/hrRrWONINPiQRyrMpGc716HOcnGT1rX
ooAbIiSxtHIqujAhlYZBHoax7XwrolneJd2+nxxzo25WDNwfYZxW1RQBn6po2nawiJqFqk4Q5UnI
K/QjmkttD0y0e2e2s4omtt3lFeNu4Yb65HrWjRQBk6n4b0jVp/Pv7JJpcBd+5lOPwIqxpuk2GkxN
Hp9rHbq33to5b6k8mr1FAGT4k0ddb0l7YP5c6ESQSf3HHQ/0/GneH7y8vdMVtRtXtruJjFKGGAzD
+JfUGtSigAooooAzNT8P6Vqzh7+yimkAxv5VsfUYNS6ZpFhpEbpp9qlur43bcktjpknk9TV6igDF
vPCuh3t0bm406JpmOWYEruPqQDg1pi0t1s/siwolvsKeWowu08YwKnooAgtLSCytUtraMRwRjCoO
gFQQ6RYQaY2nRWyrZuCGiBOCD1q9RQBAlpAlkLNYwLdY/KEfbbjGPypLWyt7OzS0t4lS3QFRH1GD
25qxRQBgP4M8PSSmRtMiDE5wrMB+QOK244IordII0VYUUIqY4CgYx+VSUUAYTeD/AA+05mOlwbic
4GQv/fOcfpW4BgYHSlooAw5/CWgz3LXEmmwmRjuJBKgn6A4q9qekWGrJGmoWyzrGSVDEjB/Cr1FA
GFH4Q0GKRJI9NiV0IZTubgj8a05bC1mvoLySFWubcERSEnK5GDVqigCrdWFrdzW81xCskls2+JiT
8h9a4/xBBt8XfatZ024v9LFuEt/Jj8xY24yWA/H9Pw7qigDzyLT7e+8Q6ZP4e0m60+O3l33FxJGY
kZOPlAPXPI/GvQ6KKACq97ZW2oWzW95Ak8LdUcZFWKKAMvS/D+laRM8un2awSOu1mDMSRnOOT7Ck
1Pw7pOrTCW+sY5ZQMb8lWP1IIzWrRQBWsbG1062FvZQRwRDnagxz6n1NWaKKACiiigAooooAKiNv
CbhbgwxmdV2iQqNwHpnripaKACiiigCC9s7e/tZLa7jEsEmNyHocHP8ASpI41ijSNBtRAFUegFPo
oAjngiuYXhnjSWJxhkcZBHuKxE8GeHkl8xdMj3ZzyzEflnFb9FAFW/sLTUrVra9gSeEnO1h39R6G
uU8S6FbafYaXDpNhsX+0onk8pSxwA3JPJwM967WigCnqWmWWq2/kX9uk8QOQG7H1BHIqtbeHdItY
4UgsYoxDIJUxnIcdDnqfxrVooAqahptnqkHk31tHcR5yA46H1B6iqWn+F9G0y6W5s7FIp0ztfczE
ZGDjJPY1sUUAZWqeHdJ1eZZtQs1mlVdobcynHpwR6mptM0fT9IRk0+0jgDfeKjJP1J5NX6KAK97Z
21/bNb3cKTwt1RxkVS0vw9pWkTtNp9msErLsLBmJxkHHJ9hWrRQBjXfhbRL25kubnT45JpDl3JbJ
P51PpmhaZpMjyWFokDuNrFSTkfia0qKAKtlYWtgJhawrEJpDLJgn5mPU1H/Z8Vqt9NYRJFd3ILM5
/ifBwT+Jq9RQB5ppMWlWdj5GvaBfS6lvZpZGtjJ5hJPIYe2K3PBelzW41WSS1ls9Ou5B9ntJidyr
g5JHbOR+VdfRQBXsrO30+0S1tIhFBHnag6DJyf1JqxRRQBhXPhDQLqdppdNi8xjk7Sygn6AgVrWt
pb2dolrbRLHAgwqDoBU9FAGBL4N8PyzGVtMiDE5O1mUfkDitSTTbOXTv7PeBTabQnldBtHQfpVui
gBkUaQxJFGu1EUKoHYDpT6KKAKFjo+n6dcT3Fnaxwy3BzIy55/w/Cpr+xtdRtWtr2BJ4W5KsO/r7
GrNFAGRB4a0a3thbw2ESxb1kxzksOhJzk4qxqejafq4iGoWqXHlZ2biRjOM9PoKv0UAYkHhLQree
OaHTokljYOjBm4IOQetWdV0LTdYKHULRZzGCFJJBH4gitKigDN0vQtL0gs2n2ccDMMFhksR6ZOTX
PX2iwar8QJBf2bTWf2AYYhgu8OO474Jrs6KAKWm6TYaVE0dhax26t97aOW+p6mq1/wCG9H1G6a5v
LGOadgAXJOTgYHQ1rUUAZeneHtJ0u5+0WNkkE20ruUnoe3JpmoeGtG1K6+03lhHLPxl8kE/XB5/G
teigChDp1jprTXVtaLE/lhW8peqqOAB0rldRE/jW9srZdPubXS7eTzZprmPYz9tqj/P6c9zRQA0o
pjKbRsIxj2qCxsbbTrRLWziEMCZ2oM4GTk9as0UAUdO0iw0rzvsFskHnEF9ufmxnH8zVNPCehJef
al0yDzc7u5XP+7nH6VtUUAZ/9i6d/Z8tj9lT7LMxd48nDHIOfzAqU6bZm7t7owL59shSJ8nKKRjH
5VbooAq2tha2InNtCsfnyGWTGfmY9TWPL4P0CecyvpsW4nJ2llH5A4rfc9qEHegBtvbxWtvHBAgj
ijUKqjoBUtFFACE4FVo7eGKWSSOKNJJSC7KoBfHTJ71O57UygAooooAKKKKACiiigCG7tYL21ktr
qNZYZBhkboabY2Vtp1qltZxLDCn3VWrFFAFa/sbbUbV7a8hWaF8ZVqfa20NnbR29tGsUMY2qi9AK
mooAqajptnqtt9nvoFniDBgrZGD6girEMUcEKQwoEjjUKqqMAAdBT6KACiiigDmdbtbrXtXi0toZ
ItLtys1zKwwJj1VF9R6//WGelAAAAGAO1LRQByWr6ZfeItZtUnsVtLGxmLee7hnmAPRQOgOB1/pX
W0UUAFFFFABRRRQAUUUUAFFFFABRRRQBNRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF
FFFAGfqet6dpBjGoXSQGXOzcCc469B7im6dr2l6pIY7G+hmkAzsBw2PoeawvE+z/AITLw15u3Zmb
O7p90VV8XLYvqmirpfk/2t9rUjyMbhHzndjt069s+9AHc0Vy/ifXL/S9Z0q2sYBcfahIDDjlmAG3
nsATk+wqCS+8Q6Rqmnf2lNbXdreyiF0hiK+Sx6EHqR9fSgDr6K5nUtV1K8159G0UwwvBGJLm5lXc
Ez0UDueRUdpqmq6Zr9tpWtyQXMd4rG3uYk2HcOqsOn/6x+AB1VFc1e6xeaN4kii1BkbSb35IZtuP
Jk/usfT/AD2NO0XVb3W9YuZ7cqmiwExRnbzO46sD/dH+HvQBf1/WrfQdO+2XMcsibwgWMAnJ+v0r
Qt5luLeKZAQkiB13DBwRnmuX8Xza3p1neahb3lr9iiCEQPBubkgdfqc10drK8unQzNje8SufqRmg
CzRXm8PizXf7Es9YkEJtluBBJEI/mnySSQe2BgD3zW/oeqasfE1xpeqvC5NqLpRGmPLyQCnv16+1
AGjrfiC10SexiuY5na8k2IY1yB05P5itiuM1+713SbuzmkvLWa1uL1Ykj8j5kDE459cDGa6u+S5k
s5FspUhuCPkd13AH3FACR39rJfy2STK1zEod4x1UHpmrNedWFrrx8a6rHFqNqt4sMZllMGVYYGAB
2rqrhdatvDl2xuYZ9SjBeN0iwpA5249eCPxoA26rX99babatc3kohgUgFyDgZOB0rP0jXIrzwvHq
8pACwl5sdmUfN+oNcprV5faj8Mpb3USvmXEquiquNqbwB/LP40AehF1EZcn5QN2faoLG+ttRtEur
OUTQPna4BwcHB6+4rm38c+HzYtGL1t5jK48l+uPpVLw3q6aJ8NYL108xkLqiD+NjIwAoA7qquo3b
WNm9wttPdFcfuoF3OcnHArmryXxVp2mtqs1zZTCJfMlshDgKvcB85yB/k102n3cd/YW93FkRzxrI
oPUZGcUAZ2i+IYtYvLq1FndWs9sFMiXChSM9OATW1XJ6F/yPviT/AHYP/QKseLtZvNHGmtZRiZp7
kRtFjmTjhQexJoA6SiuL1LUfEmhQw6pqM1nPaGRVntoo8GIH0bqa1vEGs3FpNY2GmJHJf37ERmT7
iKBkscdeKAN6iuSuNQ1rw/eWTardW9/YXUwgZ0i8tomPQ8dR1/KpvFOuX+k6ppEFjCLj7WZVMOOX
YBdvPYZPPtQB09FchNfeItI1DT31Ga2urW8mEMkcMRHkk9CD1IHv6VZ8R6zeW+r2Gk2ElvayXasx
ubgZVQOwHc8fyoA6aisjSbXWbe4f+0tRgvICvy7IBGwbPt2xmtegArM17WYNC01r25jkkQME2xjJ
yfrWnXK+LpdasLO8v7a7tfscSqRBJBuY8gHn680AdLazpdWsNxGGCSorqGGDgjIzUtVtPme4061m
kxvkiR2x6kAmudj1LWNevbxdGmt7OxtJTD58kfmNK464HQD/AD9ADa0/V4NQ1HULOKORZLFlSQsB
hi2cY59qk1bU7bSNPlvLtsRoOAOrHsB7muZ8Ercpr/iRb2RJbgSxB3QYDHDcgVLqA/tfx7Z2EnzW
unQfamQ9GkJwufpkH86AOl0+4lu7CC4nt2tpJEDNCxyU9jWT/wAJVaY1g/Z7j/iUnE3C/NyR8vPs
euK36w/+EatdusjzZf8Aia/63p8nB+7x796ANLTb1NS063vIldI50Dqr9QD61arLlj/sXwzJHasS
bK0by2cZyVTgn8q57TLzxVrukxXttLaWSbPkDx7mnYdT6KpPSgDtaK5vTPFCT+EpNYu49j24ZZo1
/vjjA+uR+dVBL4rl0v8AtZLmzQmPzlsTDkbcZALZznFAHX0Vzz+KYF8ILrvlnDJxFnq+du3P17+l
UbqXxXY6a+qy3NnJ5aebLZCHAVRyQHznIH+TQB19Fc3ruvyxeCzrOnEI7pG6bxnG5gCD+ZqheX3i
htLk1iI21tCi+Ylk0e52T/aPY45wKAOo1HUbTS7b7RfTLDDuC7mBPJ+lZsfi/QJZEjj1KJnchVG1
uSfwrF8dXYvPBFndlDGJpIZCp6rkE4rTtvEvhi4uYoYLi3aaRwiAQMMsTgfw+tAHRk4BJ7Vk+Htf
tvEFtNPaxzRrFJ5ZEqgE8Z7GrGqw6jNAg0y6htpQ2WaWPeCMdMVleDdQvL+31Fb5omktrt4d0aBA
cY5x9c0AdJRXLeIta1Ox8QafYabDHO11E+Efgbh0Yn0HU/Sok1DXNI8QadZ6tc295bagWVWjj2GN
gP1HIoA66s641eC31u00to5DNdIzowA2gKCTnnPas7V9Wv5Naj0XRhCtyYvOmnmBKxJnAwO5/wAR
+GKsGpwfEHR11S7humMMpR449mBtbgigDvKK5rUNU1G916TRtGeG3a3jElzcypv2Z6Kq9zjnmk0z
VNStPEI0XWHhuGmiMtvcxJs346hl9eDQB01Fchea3rLeK7zR9OihfEaMjyD5YQQCzNjk9eBVjSr/
AFe18RtpGrSRXSSQedFcRx7Mc4KkdOx/yaAOnooooAoanrOn6T5X9oXSW/m52bs84xnp9RV7r0rg
9WsP+Ep8RaxFjdFp9p5EPp5zfNn9MfhXQeDdR/tLwzZyscyxr5Mmeu5eOfqMH8aAN2iuQttU1vxH
c3L6NLb2OnQSGNZ5I97zMOpA6Y/z9Oh077bb2DHVp4JJUJJkiUqpX1I7GgC9RXH2GoeIPEiveabN
badp+8rCZIvMeUA4yewFbjXk+k6BJd6u8Uk1ujNIYQQr8nbjPcjH40AalFchHL4rudMGqx3NnFuT
zksTDkFcZAL5zkj/ACKlvvEssvgN9csQsU21cKw3BW3hWH86AOqorjJ7zxXJpT6xG1pbRJH5y2bR
7mZAM/M3Y45wK1PtOpa1pFhfaPdQWnnJukEse/njgfQ5oA1rC/tdRthcWcyzQklQ65wSOtM1LU7P
SrdZ7+dYImbYGYE5OCccfQ1w3gi116Xw5E2najawW+98JJBuIOeea0/iE3laJpTXLKdl/EZGxxwr
ZOKAN2w8R6RqU4hs9QhllPRM4J+gPWtWvPdcudO8RXmmweHoxNexXKyPcRRFRCg67mwO+D+FdN4j
1ifTzZ2dhGkmoX0hjhEn3VA+8x9hmgDcorkbzUNc8OzWs+qXVvf2E8qxSlIfLaInoRjqKv69rF3B
qFnpOlRxNf3YLb5c7IkHViB174+lAG/RXHXF7r+k61pNreX9tdQXs2wlINjADGR+taU2qXKeN7fS
wy/ZXszMRt53biOv4UAb9FYGp6pc23ivRtPiZRb3aymUFck7VyMHtUWpapqF3rzaLozxQPDGJbm5
lXfsz0UL3PIPNAHSUVzOnanqdl4hTRtYkhuTcRGS3uYk2FsdVZfoD/npHqmr6jceJv7E064t7ErC
JWmmTczk/wAKjof/AKx9KAOqqtNf2tveW9rLMq3Fxnyk7tgZNVdJt9VgWZdTvYbvOPKZIthHXOR+
Vcbq1rry+LdDSfUbV7phL5MiwYVPl5yO/FAHotYx8Q241i/03yZ/NsoPPdsDawwDgc9fmqXSYNXh
eU6re29ypA2CKLZtPfNNGhW41i91LzJPNu4BA68YAwBkflQBNomrQ63pkd9bxyRxSFgFkAzwcdj7
VDHrkf8AwkEukXEL2820PA7EbZ1xzj3HPHtU+iaXFoulQ2EDu8cW7DPjJyxPb61j+PLQvof9oQHZ
d6c6zxOOowRkfTHP4UAdPRVewuRe6fbXSjCzxLIB6ZAP9asUAFFRXMwt7aWYqWEaF9o6nAziuQ0i
78Q+IbEaha6rZWqOTi3WASbMHGGJOc0AdpVazv7W+877LMsvkyGKTbn5WHUfrVa+h1WTT4Es7uCG
7G3zZHj3K3HOB25rjPCNrr0kWp/YdRtYQt9IJd8G7c/GSPQe1AHotFc34kvtV0bQLe9jkjmlt3T7
VhOJFPBI9OcfnVnxBra6d4Zl1K2ZWZ418jjO4t90/rn8KANDUrxrC0adbW4uyCB5Vuu5zn2qjofi
CLWbi7gS0urWa02+YlwoU/NnHAJ9Kv6b9p/s62N8wa6MYMuBgbiORXO+Gv8AkcvFH+/D/wCgtQB1
lFYfiTWJ9NW0tbGNJdQvpPKgD/dX1Y+wyKzL2/1zw49tdand29/YSyrFNsh8tos9xjqPrQB19FFF
ABWdd6vBaaxY6a8chlvQ5RlA2jaMnPNZ+tave/2vBo2jrF9skjM0k02SsKZxnA6nP9PWsOaDVIPH
egDVLyG7yJvLaOLZj5DnI/KgDstUv4tL02e9nV2jgXcwQZJ+lN0nUYtW0yC+gV0jmXIVxgjnH9Kz
/Ea6ukEtzp95bw28MDM8csO8sQCTz9Kn8L3suoeHbK6n2+bImW2rgdSOB+FAGtRXK6vq+oTeJk0P
Tri3sW8nzmnnXcXOfuoOh/8ArH0rX0i31W384apew3gO3ymji8sjrnI/KgDTori4dX1/U9a1TTbD
7PFHbTlftMiZEa9gB3Y+/pV/w/quoHWb3RdXaKW6t0Esc0a7RIhx1HqMigBdV8Wx6VNItzpWpCJJ
PLE4iHlse2CTXSVyfxH/AORZX/r5j/ma6ygAornbmz8UTTzPDqllbR728qMQbsrnjcT3xjOKZomr
6hrPhy9dVjh1S2eSD5RlDIoBHB7HOKAOlorD8M62NV8Ox31yypLGGW44wFZev04wfxpvhHUb3V9N
lv7zasc0zfZ0C42xg4GfU5z+VAG9RRVXUb1NPspLqSOWRExlYk3MckDgfjQBaormv+Ezsv8Anw1X
/wABDW7Y3aX1nHcxpLGsgyFlXaw5xyKALFVNTvo9M064vZUd44E3sqYyR7Zq3VXUbNNR064s5WZU
njMZK9QCO1AGV/wlNpnRx5Fx/wATX/U8D5en3ufcdM1v1h/8I1a50b97L/xKRiLp8/AHzcew6VX8
W6ze6O+mfYYhM1xP5Zixy/HAB7c96AOkorjL7UfEWhzWN3qVxaT2lzOsMsEUePK3eh6nGD1rT8Qa
xdwX9npOlJG2oXYLb5fuRIOrEd+/5UAdBRXH3Opa54durR9WuLe/0+4lELyJF5bRMehwOo/wqbX9
a1W08S2em6ZFFMbmAsFk4Ctk/MT1wAOlAHVUVyUGoa1pfiSx0/Vri3vIL9X2PHHsMbKM49x0/OrW
q6rf3GuroujtFFMsXnXFxKu4RL2AHc9PzoA6Osq+1yCy1mx0ySKVprzOxlA2jHrzWbZanqmneIYN
I1iWG6S7Rmt7mNNhyvJVh06f0/DUvNGgvNYsNSd3Etlv2KMYbcMc0AN0fXINXuL+GGKWNrKUwuXA
wTkjjB9q1azNK0aDSri/mhd2a9nM7hsfKT2HtzUPieXWItKDaFEsl15gDA4JCc5IB4znH60AbNFQ
WZnaygN2qrcmNTKq9A2OQPbNT0AFFFFABRRRQAUlLTXOBQAwnJqQDAqNBk1LQAUlLTXOBQBGTk0U
UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABTgO
KaOtOJxQBJRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAHF+L7SC/wDFfhy1uoxL
BIZgyEkZ4B7V0em6HpmlMWsLKGB2GC4GWx6ZPNaBUEgkAkdD6UtAHJ+If+R38M/Wf/0EV1lIVBIJ
AJHQ+lLQBxUl5H4a8bahc6jujsdSjQx3G0lVdRjacfj+lEl3F4o8WaW+m7pbLTS8s1xtIUsQMKM9
TwK7N0V1KuoZT1BGRQiLGoVFCqOgAwKAOP8AEczeJdUXw3ZkeRGRJfTgA+WB0Uf7X+fWpfCd8+nX
D+GdRCpc2ozbuBgTxdQR7/57GurCqpJCgE9cDrQVUsGKgkdDigDjPHmv6Y2hajpYu1N98q+VtbOQ
ynrjHStjQNc03UrFLayuhNNDbr5ihWG3gDuPWtoxxk5KKT6kUqoi/dVR9BQB5Yn/ACTPTP8AsID/
ANCaupg/5Khc/wDYMH/oa11WxNu3auPTFLtG7dgZ6ZoA8+8Z+I9JvU06K2vFke3v45JQEYbVXOTy
K7PS9XsNYieTT7gTpG21iFIwfxFXPKj/AOeafkKVVVfuqB9BQBxc+oQaD4/vrjU2aC2vbdBFMVJU
lQARx9DXVabqVnqtsbixmE0IYpuAI5H1+tWnRJF2yKrr6MMiqmoyXdrYltMtEuZwQFiLiMY780Ae
d6hFc2OoX/hO3Vli1O6jlhYdEjbl/wABtA/A10nj+FLfwPNDEu2OMxIo9AGAFWNF0a9fWJdb1sxf
bWTy4YYjlYE+vc9fzPrx0jKGGGAI9DQBWl/5Br/9cT/KvPrfTp9R+FFsltGZZYZWmEa9WAkbIH4E
/lXpVAAUYUAD0FAHncLeAprUSSu8LEfPFJNNuU9wRnmuw+2aXoeiW8hkFvp6qqxEhjwRkep/OtAw
QmTzDFGX/vbRn86kZQwwwBHuKAPPdJ8TaPb+MNcvZb1VtrlYhE+xvmwuD2zWj46uoYG8P3cj4gjv
45WfBOFGCTjr0rrvJj/55p/3yKw/E2l3Oo3WivbRh0tb1JpcsBhAeevWgDH8Taxa+JbBNG0WQ3c9
1Im9kQ7YkByWYke1J420+GLUdI1C7gln0y3VobgRlgUBHDfLzj/D3rtkjSMYRFQHsoxTqAOEtoPA
txdW0cEvmzSSKIl82Yndnjgnj8a0PE3/ACOPhb/rpN/Ja6hIIY2LRxRoT3VQKeVBIJAJHQ+lAC1z
nia78ONIlhr7RhinmJvVsgEkZDAcdPWujpkkUcoxJGrj0YZoA4bwtKI/E72uiXlzeaIIcyebkpE/
YKSPp+vpXTeJNZGg6RJfG3a42sFCA46nuewrURFjUKihVHQAYFDKrqVYBlPUEZBoAp6NqA1XSba+
ETQidN2xuo/xrmvHWv6Z/YmpaX9qX7dtVfK2tnOQeuMdK7IAAYAwBTTGjHJRSfUigDF8M65puo2V
vaWd0ss8NunmIFYbcAA9R61z3hzWrPwympaZqzvBcRXTyRjYSZVbGCuOucfrXeKiKcqqg+wpGjRn
V2RSy9CRyKAOO8ETTXGu+I57iBreSWSF/KbqoIYgH3xipifsHxM3S8R6jZ7Y2PTepHH5L+orrQAC
SAAT1PrWR4j0UazYoIpPIvbdvNtph/A4/oaANiiq2nNdtYQG/SNLsoPNWM5UN7VZoAz9e/5AGpf9
esv/AKAa5Xw54t0ew8K2cMlyXuoY9pgRGLs2TgDiuu1aCS50i9giGZJYHRRnGSVIFVPDWnPp+hWM
FzEiXMUe18YJBz6igDm7bw/ev8Or60eIpe3bG58ruDuVgv1IUfnVDTj4KksI/t3mWt0ihZopZpgV
YdeM16VUbwQu+94o2b+8VBNAHIa7pFteeARBoETPboRPCg3EuMknGee5NZlu3gOa1Ek7PA5HzwyT
TblPcEZ5r0WozBC0nmGKMv8A3ioz+dAHJ+L4bWD4cyx2C7bQJEYhz90upHXnv3rq7T/j0g/65r/K
pSAwwwBHoaKAOS+JP/ItJ/18x/1rqhDECCI0BHfaKeyhhhgCPeloAz9V1nT9HWNtQuRAspIQlSc4
69BXHeDPEOlW02pxTXapJd6g7wja3zhiAD0/nXfsit95Q31FIIowciNPyoA5bVv+Si6D/wBcJv8A
0FqPFf8AyM3hf/r4f+S11e0EgkDI6GgqCQSASOntQBxl7dxaB4+lvdQJis761CJNtJVXXHBx9P1F
Vk1Qav8AEHSLmCGRbMRTJDK4x52FOSAe3IFd28aSLtkRXX0YZFG1cg4GR046UAeeaxZabY+M7yfX
4ZfsF6itDcKzhVcAAqdp9v5VraBb+En1lH0d/NvokZlIklbavQ/eOO9dayq6lXUMp6gjIpI4o4hi
ONUHooxQBy2nf8lJ1f8A69I//Za6yk2jcWwMnvUdy8sdtK9vEJZlQlIy20M2OBntQBLVe/u0sbC4
u5fuQRtIffAzWH/afif/AKF2D/wOX/Cp7K+16e7jjvdEhgt2OHkF0r7R9Mc0Ac34Y0fxC+l/b7XW
IrP7e7XDo1srkknrk+o5/GrXhBJ9H8Q6tod5KJWlAu0dV2hs/eIHbqPyrtgABgcAUbRu3YG71xQB
wfhfWLXwvbTaLrbNaTQSs0cjISsqHuCBXVQ3lrr+kXDWMpeGZXhEhUrzjGeee9aDxpIAJEVwOzDN
OAAAAGAKAOG8L+IrLQ9KTSNaZrG8syykSI2HBYkEED3rZ1rZ4l8HXX9msZFuIyYsgqXKt0wfUrW8
8UcmPMRXx03DOKdQB5rpn/CGPp8Q1DzbW8jULPFLLMpDgc8ZrW8Qw6dB8NLoaQMWTBGj5bnMq8/N
zXYvBDI4d4o2YdyoJrJ8W6fcan4avLOzQPPKE2qSBnDqTyfYUAYt14s0yXw59ksJmu76a38mOCON
ixYrj07V0HhvT30vw/ZWUuPNij+fHZjyR+Zq3ZW6wWsKmNVkEaqxAHUD1qzQBwHg/XtO0HSJNL1a
c2l3bTOGR0bkE5yMCr/j10m0nSJEO5H1CFgcdQVauseKN2DPGjMOhKgkU8qG6gHHPNAHH+K4f7D1
Cy8RWcYRYnEV4qDG+Nu5+n+HpUPjm1inn0fVpYZLrTYSwuPKJyEYDDDHOP8A61dsQGGCAR6GgAAY
AwKAOBig8B3MsEccpkkldVjTzZySxOBxnj8au+IJ10fxrpur3YZbGS3a2eUAkRtkkZx9R+tdakEM
bFkijVj3VQDT3RXUq6hlPUEZBoA4HVdai1jxV4fayjdrOG5KrcEELIxxkLnqBgc+9Xdeu4tI8ead
qV6THZyWjQebtJCtknnH1FaWvaXc3esaFPaxKYbOdnl5A2rxjA/Ct90SRdsiq6nswyKAOEl1eLWP
HuhTWkchtEEyRzspUSnYd20HsOOag1yy06y8aXNzr0Mv9n3saGKdWcKjgAEHafb+VehBFG3Cgben
HShlV1KsoZT1BGRQByOg2/hF9ZifSH82+iVmQiSVtoxg/eOO9S+JLnwrd3jWWtyRrdQAYYqysoIy
MMB79K6iOKOIYjjRB6KAKSSGKXHmxI+Om5QaAOQ8EzTNqOow2l1c3uiRhfs81xnO7uqk9R1/IetP
8XTDTvEOg6tOr/Y7dpElkVSdm4YBP6/lXXgBQAoAA6AUEBgQQCD1BoAztL13TdXkkTT7pZ2iAL7V
YYB6dR7VpUyONIhiNFQeijFPoAK57xzdLbeFLwHl5wIY17szHGB+GT+FdDXPz6Rdal4lS71AoLCx
wbSFTne+OXb6dh7fmAamkWzWWkWVq/3oIEjb6hQDWRqfildP8T2Wjmykk+07cyhsbdxwMDHIGOea
6OmlFLBioLL0OORQAy5njtraW4mO2KJC7nGcADJrzrV5fCUkM19pF/JZ6jtLRfZN6l37DbjufpXp
VRLbwrJvWGMP/eCjP50AU9BkvJdDs31FSt20QMgIwc+47HFcp4f1my8PXus2Grym0la9edC6HDo3
QjA9v1rvKY8UcmPMjR8dNwzigCs32XWdJYK3m2l3EQDgjKsOvNee6Kt1qOpab4cu1JTR55JZyejh
T+7/AAycfQ13Ws3Gq28cQ0ixiumbIYyShBH0wffvVbw1oculrc3V9Ks+pXj755F6D0UewoA0dT1O
z0m2FxfziCEsEDEE8nPHA9jXEaH4m0e18T6/dT3qpBdNEYX2N8+Ac9vevQWVWGGAI9xTfJj/AOea
f98igDj/AB7ZLLLpOpTQSXFjbOwuVjJDBGx83HPGP5VTSDwFctFGspkaVgqJ5s5JJOBxmu/qNIIY
2LJFGrHuFANADb24FpZXFyUZxDG0hVerYGcD3rK8K+IR4j0+S5Fq1sY5DGVLbgeAeDgetblNRFRd
qKFX0AxQBx2p3Ueg+PU1G+JSyvLTyBNtJCOCDg4+g/OqkurLrHjvQZ7aJ/sSeckU7AgTHZ8xAPOB
xz9a7x0SRSrqrKezDIo2rx8o+Xpx0oAwPE+v6ZY2d5Y3V2sd1JbPsjKsc5UgcgY61R8Ca5psmjaf
piXSm9WNsxbWyMEnrjHSutaNGOWRSfcUixopyqKD6gUAcx4lufCt1dGy1uSNbmEDBKsrKCMjDAfp
VXwVNKdV1CCyu7m90SNV8mafJw/GVUnGR1/T8ewkhilx5sSPjpuUGnqoVQqgADoBQBweja5pukeJ
fEaahdLA0tyCm5ScgZz0HvV/w+W1fxXfa9FG6WPkC2gd1K+byCWAPbj9auaFpE9rq+t3F3CnlXVw
JISSGyOefbrXQ0AcB4+8QaXdaU9hBdq91FcqHj2sMbSQecY4rrtM1vT9YWY6bcrcGHG7CsMZzjqP
Y1fMUZOTGpP0pVRU+6oXPoKAPL9MuNDure4m8UyXNxq/nMrW7NJuHPCoq4FdD8N1CaZqaLE0IW/k
AjfqnyrwfcdK67yo/M8zy18zpuxz+dQX73EFlLJYWy3FyMFYiwQMcjPP0zQB55rv2rR9V1XRrNDs
1wo0GOiszYcfjz+GK9FsLSOwsLe0hGI4Iwi++B1rA0vR9Qu9cGta6IkmiTZbW0R3LED1JPc9f84r
p6ACquow3U9lJHZXQtLhsbZjGH28jPynrxkfjVqigDmv7J8Tf9DMn/gAn+NbtjFcQ2ccd5cC5uFH
zyhAm7n0HSrFFABRRRQAVyfjL/kKeGv+wgn8xXWUhUHGQDjpntQBynxC/wCQRY/9f8X/ALNUfiOQ
6P4t07XJo3ax8g20zqpPlckgkenP6V15UN94A/WggEEEZB7UAcP4h1O18VfY9I0dzdM86yzyqpCx
IOpJI61d1D/kpOk/9ecn/s1dTHFHEuI0VB1woxTto3bsDI70Acp4l/5HHwt/vz/+grWT4isrC08Z
ve65DK2m3kKqsyM4EcgwMHac9B+v1r0EqCQSASOh9KGUMpVgGB6gjrQBx2i2/g+TWIDpb+bfRgvH
iSVscc9TiuyqOOGOIYjjRAf7qgVJQAVj+J9afQNJN8lq11h1UqG2hQe5ODx2/EVsVgeINI1HWmNn
9sht9LcL5oVCZXwckZPAHSgDV028TUdOtryNSqTxrIFPUZHSrVRW1vHa20VvCu2KJAiL6ADAqWgA
ooooAKKKKACo3OTTycCowMmgB6DAp1JS0AFRMcmpGOBUVABRRRQAUUUUAFFFFABRRRQAUUUUAFFF
FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAKOmaSlPAxSUATUUUUAFFFFABRRRQAUU
UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR
QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA
BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF
FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU
UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR
QAUUUUAFFFFABRRRQAUUUUAFFFJQA1z2oQd6aeTUgGBQAtFFJQAxzzim0E5NFABRRRQAUUUUAFFF
FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUq0lO6CgBp60UUUATUUU
UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ
AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB
RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF
FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU
UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ
AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFNc4FOqJjk0AKgyakpqjAp1ABTHPGKfUTHJoAS
iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAB1
pWoHAzSUAFFFFAE1FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFNZ0TG5lXPqc
UqsGGVII9RQAtFFFABRRRQAUUUUAFFNDqxIVgSOoB6Uu4btuRu64zzQAtFMkljiXMsiIPViBSo6u
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
tllt4yCiEkAEDA6exNXqKAMD/hDPD3/QMi/76b/GtW5sLW7nt5riFZJLZt8TEn5D6/pVqigCte2F
rfrELuFZRDIJUyT8rDoa5PxXA58SWNzqOn3F/o0UJGyFN+2Qk5LKO2MV2tFAHm9zYWmp39h/wjej
3VjPFOryXbRGJEQdRz1P+Fd81hatqK37QqbtI/KWTJyFznH6mrVFABVHU9I0/Vo1TULWOcL90sOV
+hHIq9RQBlaZ4d0nSZzNYWSQykbd+5mOPTkmpNU0TTdXC/2hZxzleFY5DAemRzWjRQBmaXoOmaO7
vp9okDuNrMCSSPTJJqzBYWtveXF3DCqXFxjzXBOXx0q1RQAVzHiC2u9d1OHRxDJFpke2a7nIwJRn
hF9eRz/nPT0UAIqhFCqAFAwAOwqjfaPp+oXMFxeWsc01ucxs2eO/4/jV+igArPu9Jhubn7Sss0E+
MF4X2k/WtCik0nuVCcoO8WVBYqbB7R5ppFcEF3bLc+9SJbIlkLUFvLEfl574xip6KOVDc5Pr5laC
yhgsRZ4LwhSuH5JBqmuiJGNsN7exRdkSXgfTitWik4RY1Vmr2e5TudPiubWGCR5NsTKwbPzEj1Jq
S+tI761e3lLKjYyVPPBzViinyoXtJKzvsIo2qAOwxXLaVZ3Xh7xBLZwwPNpF+5liZBkWz4yQfQHt
+HvXVUUyAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo
oAKKKKACiiigAooooAKKKKACiiigAooooAKiY5NPY4FMUZNAD1GBTqKKAComOTT2OBUdABRRRQAU
UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAKOBSUp9K
SgAooooAKKKkUcUAOooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC
iiigAooooAyPEms/2JpyzJD59xNIsMMWcbnPTPtxUemN4kN2h1RNLFswORbl96nt14rlvF8WvLJp
f2u5sXU36CDy42BV+cFs9RXWaXFryXROqXNjLb7ThYI2Dbu3Xt1oA2KK5fwXPLM2t+bK8mzUZVXe
xO0ccD2o8Mzyy+JfEqSSu6RzxhFZiQow3T0oA6iivPfCulXPiDTJJNR1O8+zRzOkUUUpU5zksx79
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
3nP9B7UAWdWu7uytBNZWLX0m8AxK4U7e5Gfw4rmtU1HWdb02fTrfw7PC1wuxpblwEQHv712dFAHK
at4cuj4d0uCwkV7/AEpo5Ii3AkKjke2f6VBqV7rmu6e+mQ6JNYvcDZNPO42Rr3x/ersqKAOa1/w5
Jc+HLSy05wtxp5je3Lcbigxg/X+dFtr2tSNFDN4buEnJCu3mqIx6kH9cV0tFAHOeJ7C5vNT0GS3h
aRLe8Dykfwrxyaqf2dfeHNb+0aTbvc6VeNme1TGYW/vqPT2/D0x11FAHLeJNMvV1qy1zTrVL14Iz
DNbMQC6HJGM9xk/pU9hqc91eQx/8I3cWyk/NNKEUJ7+proqKAMHxjpVxrHh+W3tMG4VlkRScBiD0
zRpWtaleXUMF1oVzaZB8yVmGxSAenrk8fjW9RQBXvruGwsprq4bbFChdj7CsHwJayxaLJeXC7ZtQ
ne6IPYN0/wAfxrR1rRU1lrVLmdxaRPvkt1HyzHsCfQGtQAKAAAAOABQAtFFFAHK+OgFTQ5Rw66nC
A3cA5z/IV1VZuu6RBrenG0nd48MHSRD8yMOhFP0m0vbO2aO/1A377srIYRGQuOhx1+tAF+iiigAo
oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii
igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK
ACiiigAooooAKKKKACiiigAooooAKKKKACiiigApjnjFPqJjk0AKg5zUlNUYFOoAKY57U+omOTQA
lFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAo
60HrQOBSUAFFFFABRRTkHOaAHjgUtFRs3PFAElFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABR
RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRWfr0skGgalNE5SSO1lZGU4KkKSC
KANCiuI0fSdXv9BtdQg8RXyXUsQcLJh48+hB7Vq+HPEJv/Cz6nfLte2D+fsHXYMkgfSgDoqK5ufx
rpEUaOhuLjMYlcQxFvKUjIL9hWxHqdlJpY1JbhPsZTzPNPAx/ntQBcormV8caQWQuLuK3c4W5kgY
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
aVplvYwkmOBNoJ6k9z+JyaALlFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF
ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA
FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU
UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR
RQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUhOBQAxzk05BgUwcmpKAFoo
pCcCgBjnJptFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF
FABRRRQAUo9aSlPAoASiiigAooooAVRk1LTUGBS0AMc84ptB5NFABRRRQBNRRRQAUUUUAFFFFABR
RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFM
aREIDOqk9ATjNOzjrQAtFZGia1/a02pIYRELO5a3Hz537e/TitagBaKYJELlA6lh1APNOoAWimll
DBSwDHoM8moNQuhZafc3RXf5ETSbc43YBOM/hQBZorP0TUf7U0i1vmQRGdN2wNnb+NVte10aS1tb
w2z3l9dsVhgQhd2OpJ7CgDZorAsNQ8QvexR32iww27nDSx3KsY+O47/hW90oAWimq6uMowYeoOaW
gBaKarq4yjBh04OaUkAZJwKAForn01W5bxu2mB1Nn9i88AAZ3bsZzVWbxJqkmtX+n6bo6Xf2IqHY
3IjJ3DI4I+tAHVUVi6Br66w1zBLayWd7asFmgc5256EHuOK2GdUGXYKPUnFADqKShmCjLEAepNAC
0UgIIyDkUjOqkBmAJ6AnrQA6iisW8bW/+EjsxaCA6TsPnliN27n8fTGPfNAG1RSZx1paACik60m9
S5TcNw7Z5oAdRRXNxaleav4ma3sJfK07TmxcyAA+dJ/cGew7/wD6qAOkopKTepYruG4c4zzQA6ik
pNy7tu4bsZxnmgB1FJ0pEdXGUYMPUHNADqKTPOKM0ALRVDWjfjSrj+yvL+3bf3QkxjORnrx0z171
JpZvDpludR2C82DzdnTNAFuimllGMkDJwOe9KGBYqCMjqM9KAForH8SNrAsE/sLyTc+YN/mEfc5z
jPHXFaybvLXzNu/A3beme+KAHUVkS61s8UQ6OIQRJbG4Mu7pyRjGPbrmtbI9aAFopKjuJ47a3lnm
cLFEpd29ABkmgCWiuUt/EOualELrS9CVrNs+W89wqNIPXHaujsZZ57OKS6t/s07D54t4bYfTI60A
WKKbvQOE3LuPbPNOoAKKaXUEAsAT0BPWsTxjqVzpHhy4vLNlWdGQAsuRywB4oA3aKZG2Y1Y9SATT
qAFopqurEhWBI6gHpVXVb0abpd1ebPM8iJpNm7G7AzjNAFyiqelXv9oaVaXjKIzcRLIUBzjIziot
chv5tMkGl3Agu0IdCQCHxztOexoA0aKyvDusJrelpchPKmUmOaI9Y3HUVqUALRSAhgCCCD0IpaAC
iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK
KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigApjntTqjJyaAHIO9PpAM
CloAKY57U6oicmgAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi
iigAooooAKKKKAFXrQetL0FNoAKKKKACgDJop6DvQA6mueMU+omOTQAlFFFABRRRQBNRRRQAUUUU
AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA
UyUOYnERAk2naT0B7U+o5jIIJDCFaUKdgboTjjNAHmemR6FDut/F9ncR6q7t5lxclysnPBDA9Mf/
AK67yfRtL1LSLaylhWexiVTCBI2MBcKcg5PB9axb6XxLqNlNYz+H7MCVShle6VkXPfb1rc0DTW0j
RLSwaTzWhTBf1JJJx7c0AcZ4W8LaNfz60t1ZCQW19JDEPMcbUB4HB5/GuyurPTrPQJLSVvs2nRx7
GO8jav1PNYUNjrug6tqUmnWUGoWd9MZwGmEbRsevWr3iHS77X/CjWrrHb3rbXMYbK5BztzQBxutD
wvHpMk+iW93DdxYeG5jSUDOR/Ea6HxnM9x8OxPIcySpA7H3JUmm6nb+KNZ0aWwbT7TT4/Lw2JQ5l
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
0jxrPGULp1Ga53wgrahqOq6+6lY72QR2+RgmNOM/jgfka6DVvO/sm7+zzrbzeU2yVuiHHWgCv4d0
ddC0mOxSd5whLb2GOp7DsK1K5nwDfX2oeG0n1B2lk81lSRurKMc+/OR+FdNQAUUUUAFFFFABRRRQ
AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB
RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUANc4FNQZNDnJpyDAoAdRRRQA1zgVHSscmko
AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACgdaKU
dKABqSiigAooooAKlAwKjQZNS0ANY4FR05zzim0AFFFFABRRRQBNRRRQAUUUUAFFFFABRRRQAUUU
UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ
AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFZt3o1
rdaraaid8d1bZAeNsb1/ut6itKigDN1fR4dWayaaR0+yXC3C7Mckdj7VpUUUAFFFFABRRRQAUUUU
AFFFFABRRRQAUUUUAFV723a6s5YEnkt2dcCWI4ZfcVYooAxtG8O2ulXEt15s93eyjD3Fy+58eg9B
WzRRQAUUUUAFFFFABRRRQAUUUUAFFFFABVHV9Mh1exNpcPKkLMpcRtt3AHO0+xq9RQAyGKOCFIoU
VI0UKqqMAAdBVLVdGstYWJb+JpUiJIQOyg/XB56VoUUARwwx28KRQxrHEg2qijAA9AKkoooAKKKK
ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA
KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKQnApaY57UANAyakpqDvT6ACkY4F
LUbnnFADaKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK
ACiiigApT0xQtIetABRRRQAUUUoGTQA9BgUp4FFNc8YoAYeaKKKACiiigAooooAmooooAKKKKACi
iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA5Lxpp32exuNcs7q5t76
3CsCkh2sAQMFenSums5jcWVvOwAMsauQO2RmqPiVbZ/DuoLesyW/ktvZBlh6YHrnFU/CMmsPpkA1
KKBbcQr5Dqf3jLjgsMkA4x0oA6GikJA6nFLQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF
FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU
UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ
AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB
RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFACVGeTT3OBTUGTQA8DApaKKAEqInJp
7njFMoAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA
CiigdaAHdBTaVqSgAooooAKeg70ypQMCgBaiY5NPY4FR0AFFFFABRRRQAUUUUATUUUUAFFFFABRR
RQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAc547uYYfCd+kkiq8ihUU
nljuHQVs6ajR6ZaI4IZYUBB7HaKgn0PTLjURfz2cUt0MYkfnGOnHStGgDg/iM1vqEVpYWlwZNVSc
bLeI5bkdWA6djk13ECukEayNudVAZvU45NItvAk7zpDGsz/ekCgM31PepaACiiigAooooAKKKKAC
iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK
KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo
oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig
AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoopGOBQBGxy
aeowKYBk1LQAUUU1jgUAMY5NJRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ
AUUUUAFFFFABRRRQAUUUUAFKOBmkpT0xQAlFFFABRRRQA5Bk1JTVGBSk4FADHPOKbRRQAUUUUAFF
FFABRRRQBNRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR
RQBWv762020e6vJlhgT7zN/nms3TPE9hql2tvbrch3BZGkhZVYD0JrlfGWvRXy6dAdP1FI475GcS
25USAZGF55J9K63S9fj1O6MCWGo25Clt9xblF47Zz15oA2KKxfDurzasdSE0cafZLt7dNmeVXuc9
6NG1ibUNY1izljjVLGREQrnLAg9fyoA2qK4rS/Emv67bP/ZlhZo8Tssk1wWEZOeFUA5Jx1rb8Ma1
JrVhK9zCILq3maCZFOQGHp7c0AbVFcnFr+sa1cT/APCP2lp9jhcx/abxmxKR12hea1hJrbaPu+z2
SamGxsZ2MRGeuRz0oA0Y7iCWaWKOaN5YseYisCUz0yO3Spa860F/EQ8Qa+bWHTTcGWP7QJGfaDhs
bcc+vWu3t21I6UxuEtRqO1sKhbyt3O3nrjpn8aAIxrlgdcOj+aftoTft2nHTOM+uOa0q5CwvtQTx
lDZ6pYaYtzLbGT7RbqxfaCQBuP0re13V4dE0uS9mUvtwqRr1dj0AoA0aK5G51bxTYWZ1G707T2tE
G+SCJ285F75J449qt674mFhoFlq1mizQ3EsYwwOdjAk4APXigDo6K42/8Q+INNt49TvdNtI9MZ1D
xB2M8ak8E9s+1diCGUEHIPIoAWiis3xBqP8AZOhXl8MboYyUz03Hhf1IoAWLWLafWpdLhDyTQx75
XUZSM9lJ9TWjWF4Q00adoMDPlrq6H2ieQ/eZ255PtnFLrmtT2d5a6bp1ulxqN1lkWRsJGo6s3tQB
uUVzMGtarYava2GvW9oFvCVguLQtt3D+Ehuf8/ka94kuNK121sILP7V9ohLIiffZ84Az0A9TQB01
FcrDres2Wt2VlrdrZrFf7hC9szEow7Nnr1HT1pdV8S3ll4lOk2tiLp5LcPCFOCXLfxHoFABNAHU1
m3ms2tjqlpY3IeNroHy5Sv7ssP4c+prKsNa1WDxDDpOt29or3UbSQSWpbbxklTu9ga0vEelJrOi3
Fqw/ebd0Td1cfdI/z3oA1aKxPCGpvq/hy0uZTmYAxyH1ZTjP48H8a26ACqGr6vZ6NaC4vZCqswRV
UZZ29AKv1ynibbL4o8NQDDsJ5JCnUgAA5x+FAHQabfDUbRbhbe4twSRsuI9j/XHpVuiigAooooAK
KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo
ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii
gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA
Co3POKeai6mgB6DvT6QDApaACo3POKeeBUR5NABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA
UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAKtIetO6Cm0AFFFFABSgZNJT0HegB9Mc9qfUROTQ
AlFFFABRRRQAUUUUAFFFFAE1FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA
BRRRQAUUUUAFFFFAHJ+Ouuhf9hKL+tdZUU9tBcbPPhjl8tg6b0DbWHQjPQ+9S0AcP4Y1Sx0m88Q2
+o3UVrIt/JLtlbaWU9CPXp29RUnge6W+1vxHdRo6JNLE6hxg7SGwce45rqLjS9Purhbi4sbaaZek
kkSsw/Eip47eGKWSWKGNJJcGR1UAvjpk96AOY+HX/Iuyf9fUn9KZ4NQyf8JGgOC2ozDPpmuqt7aC
1jMdtDHChJbbGgUZ9cCiG2gtzIYIY4jIxd9iBdzHqTjqfegDjfBGr2OmaQ2k6lcRWV7aSurpOwTd
kk5BPB6/pXX2d5b30AntJkmiJIDocgkdeaju9L0++cPeWNtcMOA0sSsR+YqxBBFbRLFBEkUa9ERQ
oH4CgDjtIv7XSvGfiKHULiO1a4aKSIysFVgAehPHcV1iX9nJZG8S6ha1GSZg42YBweelNvNNsb8q
byzt7kr90yxhsfTNPWytUtPsi20K22MeSIxsx6belAHG3Osaa3xEs7pdQtTbrYsjSiZdgbc3Gc4z
Vzxyftfh61v7MrcwWt1HcsYzuDIMgkY+tbv9g6P/ANAqw/8AAdP8KuxQRQQrDDEkcSjARFAUD6Cg
DnNb8T6Q/h25eC9hne4hZIoUYF2ZhgAr1HXmsTWrKXT/AAFodtOCsqXMRZT/AAk7jj8M4rtIdH0y
3uPtEGn2kc2c+YkKhh+OKs3FtBdIEuIY5lVgwWRAwBHQ896AOd+In/Im3v8AvR/+hrXRW3/HtF/u
D+VFxbw3ULQ3MMc0TdUkUMp/A1IAAAAMAdBQAtc/45t3ufCGopGCWVFkx7KwY/oDXQU11V0ZHAZW
GCD0IoAp6LcpeaLZXEZBWSFDx245H51yHiuCOHxnYXd7d3VlZT25g+028hQo4JOCw6A5H+RWz4e0
6+0PULjTVQy6Q2ZraXdzESeYyP1//XxvzwQ3MTRXEUc0bdUkUMD+BoA5ODSdCn1GyY+Irq+nilEs
EUl+suWHPT8Kl1L/AJKTo/8A16yfyat210bTLOUS2unWkMg6OkKhh+OKtNbQPcJcNDG06AqshQFl
HoD1FADmjR2VnRWZTlSRkj6Vyy/8lQf/ALBv/s4rrKi+zQfaftPkx/aNuzzdg37fTPXHtQA4xo0i
uUUuv3WI5H0NNuJ0traWeU7Y4kLsfQAZNS1z3iWz1DV3t9KgUxWE3z3VzuGdoP3APU/570AV/h5C
8XhWKSQbTPI8oHoCcD+VdTUcEMdvBHDCgSKNQiKOgA4AqSgArirrTrbw74u0iXTFMS6g8kVwjEsG
4BBBOSOT612tc54r0+9nfTdQ06JbifT5/M8ksF8xT1AJ78UAdHRVTTbuW9tFmntJbOQkgxS4yPyq
3QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF
ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA
FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU
UUUAFFFFADHPGKRBzmkY5NPUYFADqKKKAGOeMUylY5NJQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR
QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFKOtJSjgUAB60lFFABRRRQAVKBgUxBzUlADWO
BUdOc5NNoAKKKKACiiigAooooAKKKKAJqKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo
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
5OPvkryT61pJpDnQ7jTrq+nujcI6NPJjcAwxx9Kns9OS00aPTldmjjh8kOepGMZoAyvAJJ8GacSc
8OP/AB9q6OqGiaZHo2kwWEUjSJDuwzdTlif61foAKKKKACiiigDJ1ca95sf9jnTRHt+f7Xvzn229
q4/woPEv/E1/s86T/wAf0nnef5n+s4ztx/D9ea9GqjpmlW2l/afswf8A0mZp5NzZ+Y9ce1AFuLzP
KTzdvmbRu29M98e1PoooA4bW3vm+IlotrDBPJDZl4UncqoJJBYY7/wCFWLnTdf1HXNKvbm2sbf7H
LlnimJZkOMjkemfzrZ1zQLfWGgmMs1rd25zFcQNh19vcVHp+i31teRz3Wu3l2sef3TKqq3GOcdaA
MjWbSC9+JGlR3MayxraM+1umQWIzXRX2j219qVjfyNIs9kWMewgA5xkNxyOKbNo8c3iC31cyuJYI
TCEAGCDnn9a06AOMazgu/ii5uIlk8ixEqBuQGDAA/qa6KbR7abXLbVmaRbm3jaNQpG1gc9eM9z3p
qaPGniKTWBK5le3+zmPA2gZBz+ladADZApjYSY2YO7PTFct8N93/AAiMGc7fNk2Z9N3+OaseLdSk
jtl0mw/eanqAMcaD+BDwzn0AGf8AIrW0jT49K0u2sYuUgQLn+8e5/E5NADNXttLuYYhq62zRhxs8
8gDd6DP8qvgADAGAK4bx81vrKxaNZpLcatHKrBEU4jBHJY9MYIrtLWIwWkMLNvaNFUt6kDGaAJqK
KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo
oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig
AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC
iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAqNzzink
4Gai6mgB6DjNPpKWgAqNzk08nAqKgAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii
gAooooAKKKKACiiigAooooAKKKKAFWkNOPAptABRRRQAUqjJpKeg4zQA+mOe1OqInJoAKKKKACii
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
txyDjvyOlU/CN9qN3psCXun/AGeGOFRFP5g/fDGAdvVeOeaAIPElxe6Hfw61FLJLYDbDd2xOQqk8
Oo9cn+VdLHIksaSRsGRwGVh0IPQ1T1uFLjQ7+KQAo9u4Oe3ynms/wPK83hDTWkJJEZTn0ViB+gFA
GzPdW9s0azzxRNK21A7hS59BnqamrG1zw3Y67PaS3hmDWrEr5bYDA44PHt2rZoAKKKKACiiigAoo
ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii
gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA
CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK
KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigApKWmucCgBhOTUgGBTEGTUlABSUtNc4FAEZ
OTmiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo
AKd0FNHWlagBKKKKACiiigB6DvT6QDApGOBQAxjk0lFFABRRRQAUUUUAFFFFABRRRQAUUU5BzmgB
4GBS0UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF
ABRRRQBz/jh1TwhqJZgMoAM9yWFaulArpVmpGCIEBH/ARVK+8N6dqOoLeXsck7LgiNpD5YI6Hb0r
XoA57xlqDW+kmwthvv8AUf8AR4Yx154Y/QA9a1tJsV0zSrWyQ5EEYQn1Pc/ic0n9l2n9qnUjFuu/
LEQdiTtX2HbrV2gDh/iFPceZpa6Zful8J9i20T8tnoxA9CMc/wB6u3qpDpdhBeyXkVpCt1IctLt+
Y/jVygAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA
KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo
oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii
igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACo3OTTycCowMmgB
6DAp1JS0AFRMcmpGOBUVABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU
UUUAFFFFABRRRQAUUUUAKOmaSlPTFJQAUUUUAFKgyaSpEGBQA6o3POKeeBUVABRRRQAUUUUAFFFF
ABRRRQAUUUUAFSKMCmKMmpaACiiigAooooAKKKKACiiigAooooAKKKKACiiigCOaVIIJJpCQkalm
IGcADJqjpWuabrIf+z7pZmj++uCrL+BANaVcncKsPxMtGQBDPYMGI43kMfz6D8qAOsooooAKKKKA
CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK
KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo
ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii
gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA
CiiigAooooAKKKKACiikoAa57UIO9NPJqQDAoAWiikoAY55xTaCcmigAooooAKKKKACiiigAoooo
AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKVaSndBQA09aKKKACiiigBQMmpK
ag70+gBjnjFMpWOTSUAFFFFABRRRQAUUUUAFFFFABRRQKAHoOM0+kHApaACiiigAooooAKKKKACi
iigAooooAKKKKACiiigArj/Etuur+KtM0p2MCLC9wZosCUc4AVu3SusmkEMEkrKzBFLEKMk4HYet
crprXOs+MRqwsrm0sre1MKG4TY0jE54Hpz+lAHUWluLW1igWSSQRqFDyNuZvcnuamoooAKKKKACi
iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK
KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo
AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA
ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi
iigAooooAKKKKACmucCnVExyaAFQZNSU1RgU6gApjnjFPqJjk0AJRRRQAUUUUAFFFFABRRRQAUUU
UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAA60rUDgZpKACiiigAoopyDJoAe
BgUjHAp1RucmgBtFFFABRRRQAUUUUAFFFFABRRRQAU5Bzmm1IowKAHUUUUAFFFFABRRRQAUUUUAF
FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU
UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR
QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA
BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF
FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFACMcCowMmlc84pUHegB9FFFAD
WOBUdOc84ptABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA
BRRRQAUUUq0AB9KSg9aKACiiigAqRRgUxRk1LQAhOBUVPc9qZQAUUUUAFFFFABRRRQAUUUUAFFFF
ACqMmpaYg4zT6ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK
KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo
AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA
ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi
iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK
KACiiigAooooAiPU1IOgoooAWiiigCE9TRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF
FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFO/hoooAbRRRQAUUUUAOTqakoooAib7xpKKKACiiigAoo
ooAKKKKACiiigAooooAlHSloooAKKKKACiiigAooooA//9kKZW5kc3RyZWFtCmVuZG9iagoxNzgg
MCBvYmoKPDwvUjYxCjYxIDAgUj4+CmVuZG9iagoxNzkgMCBvYmoKPDwvUjYyCjYyIDAgUi9SNjMK
NjMgMCBSPj4KZW5kb2JqCjE4MyAwIG9iago8PC9SNjEKNjEgMCBSPj4KZW5kb2JqCjE4NCAwIG9i
ago8PC9SNjIKNjIgMCBSL1I2Mwo2MyAwIFI+PgplbmRvYmoKMTg4IDAgb2JqCjw8L1I2MQo2MSAw
IFI+PgplbmRvYmoKMTg5IDAgb2JqCjw8L1I4OQo4OSAwIFIvUjgyCjgyIDAgUi9SNjUKNjUgMCBS
L1I2Mgo2MiAwIFIvUjYzCjYzIDAgUj4+CmVuZG9iagoxOTMgMCBvYmoKPDwvUjYxCjYxIDAgUj4+
CmVuZG9iagoxOTQgMCBvYmoKPDwvUjg5Cjg5IDAgUi9SODIKODIgMCBSL1I2NQo2NSAwIFIvUjYy
CjYyIDAgUi9SNjMKNjMgMCBSL1IxMzgKMTM4IDAgUj4+CmVuZG9iagoxOTggMCBvYmoKPDwvUjYx
CjYxIDAgUj4+CmVuZG9iagoxOTkgMCBvYmoKPDwvUjg5Cjg5IDAgUi9SODIKODIgMCBSL1I2NQo2
NSAwIFIvUjYyCjYyIDAgUi9SNjMKNjMgMCBSL1IxMzgKMTM4IDAgUj4+CmVuZG9iagoyMDUgMCBv
YmoKPDwvUjYxCjYxIDAgUj4+CmVuZG9iagoyMDYgMCBvYmoKPDwvUjIwNAoyMDQgMCBSL1IyMDMK
MjAzIDAgUj4+CmVuZG9iagoyMDQgMCBvYmoKPDwvU3VidHlwZS9JbWFnZQovQ29sb3JTcGFjZS9E
ZXZpY2VSR0IKL1dpZHRoIDU5OQovSGVpZ2h0IDUwNAovQml0c1BlckNvbXBvbmVudCA4Ci9GaWx0
ZXIvRENURGVjb2RlL0xlbmd0aCA0MDA0OD4+c3RyZWFtCv/Y/+4ADkFkb2JlAGQAAAAAAf/bAEMA
DgoLDQsJDg0MDRAPDhEWJBcWFBQWLCAhGiQ0Ljc2My4yMjpBU0Y6PU4+MjJIYklOVlhdXl04RWZt
ZVpsU1tdWf/bAEMBDxAQFhMWKhcXKlk7MjtZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZ
WVlZWVlZWVlZWVlZWVlZWVlZWf/AABEIAfgCVwMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAA
AAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGR
oQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdo
aWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU
1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJ
Cgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVi
ctEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqC
g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl
5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/APRaKzdWf7KYL7krA2JAO6Nwf1xWe0SJHYtqHEM7
PLNu+7vPKg/T+lJyMZTs7G/K/lxO+1n2gnaoyT7ClRt6K2Cu4ZwwwR9awN0A0CYTOBFuk+y7yQSO
duO/0pZZ7W4XTvPlR7MIVkO75fM2jAb9aOb9Be0NC41SOHSru+EbslsHLKcAnbnP8qivtVmstE/t
F7IsVXfJEJRlV9c9D2rLn2f8IPqvlEmPyp9pPpzirniMj/hDb05GDbf0pp3V/Q0g+ZK5uA5APrS0
1PuL9KpaunmQQISQGnQHBwcZpt2Kirl+isLUbWK2kto08uG0YszhwWQtgYzyKhbyltraF5beWAu5
WWQNsXH8IGee+MntUc5oqaaTudHVG41SC30y4vnD+XBuyvdiDjA+p4H1rIgaJobMXjZtA0o+bIXI
Py5z7ZxmorzaPCbSx5MMNyszdc+WsoYn8hmhSu/68glDlV/66nTxMzRIzpsYgErnOD6Uk0yQR75D
hcgZxnknA/nWdrYikhgLzwou/IWbOyTjocfnVSaO3uPD8czWyosbDABLALvGSO+COfpTctWc0ptX
S7HQUyV/Lid9rPtBO1Rkn2FZd4ltJptulqwEDzooMberc4NGpW9hZaVNHtSIMGZAWP39vGPehysm
x8xqo29FbBXcM4YYI+tOrBY29++kx71mjwyuA3GQgODUAWFBbxXZP2GOWZMMTtBB+UH8M4ocrOxP
tNLnS0Vl6AVOnHYSU819uc5xuOOtLqMST6jYRyrujbzMrng8CnfS5rT9/U06K51zGtvBbyiIRLLK
FefcVUKeBgEZP19KrbFnsl3kt5UUxQ8/LhxjGeaj2nkbKl5nV1U1O+XTrNrp0LxIy+Zg/dUkAt+G
c1iSRhJfJLJHZpO4xICUBwuAcEe9SX5SHwfqI88To0UiR7VOMsNqqMk55OBTUridO3U6EHIyKWob
RGjtIEk++sahvqBU1aMxQUUUUDCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi
iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK
KAIbu5is7Sa5nbbFChdyBnAAyaS0uPtdqkxhlhD8hJQAwHuAT9ayvFpuf7AuvIERh8tvPLE7hH/F
t7ZxnrW0v3RjpigB1J1paKAGSxRzRPFKiyRuCrIwyGHoRVZ9L097RLR7G2a2jO5IjEpRTzyBjA6n
86uUUAJ0paKKAEoxS0UAJSOqujI6hlYYIIyCKdRSAYkaRxrGiKqKAqqBgADoKfRRTAKKKKACoLmA
zqoE0sJU5zGQCfzBqeikBDbW6WsCxR52jJyxySSckk1NRRTElYSloooGJTJYYpgoljSQKwYBhnBH
IP1FSUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF
ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQBFc28V
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
jOAMc1j+LUb/AIR67njmnhlgjLo0MrIc++CM/Q1Y1ueS30W4lRJHCxMXMcux1XacspweR2ovZBbY
0qKxrjVZLWPTIba1e6mvEOwPKFxhQcscf59KLLXRdNYxvbNFLcvLE67wfLePO4Z7jI60xGzRWLLr
8cEIuZ4GSzW4kt5Zt2fKKsVDEY6Ejr2yK0NOunvbNLh7d7cSZKI5+bb2JHYkc47UgLVFZ+qai1ib
eKG3NzdXLlIogwUHAySSegAHv9KzvELXMvhe6uZlmsbqBGdRBcngjocrjI+o/CgdjoaKzdQ1GW1k
tba2tvtN1c5KI0mxQqgbiWwfUdj1qhJ4mC2NtKLUJcTTtbGKeYRrHIudwL4I7cYHORTEdDRWDqHi
Iafb2f2iGGO7ut22OS5VY1C9SZMYx0xxk56VBda3/aXheWe1PkyyyraMUcN5bM4QlWHB4bIP0oA6
WisHxRcXWm+HZjp0f3ECbxJtMYyACOOTzQt5c6dDaWMVnJPez72Ect2X2qvVmkIJ7jjHekBvUVyU
U1zdeDL66leWO5glnmTe+5o2SRmC59BjHpit281CS30f7dDaS3T7FYQRDLNnHTGemf0oA0KKQHIB
6UtMAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK
KKACiiigAooooAKKKKAKt9by3MapFJEoz8yyxeYrD6ZFU00cw2lrHBcbJ7ZmdJPLGPmzuG30OfWt
aimm0UptKxnS2NzIYJvtai6hLYfyvkKt1G3PsO9Un0y4huLAQTEyq8ssk7R5Us2M5GeAee9b1FCk
0NTaMldHeNYpIrnF0jO7SNHlX3nLArnpwO9OvtNmvNGltZLhTcH545Qm0K4O5TjnoQK1KKTbYnJv
coz2ktx9nn3pDdRrzgb05HI7ZHvxTZNPe4jjjupxJErFnRU2hz2HXoK0KKVkZ8qM9rC4+wNaLdja
cqGePcdh6Dr1HrSmxlfTjay3ALDbskWPGNuCOMnPSr9FKyDkRm6nZ3V5pElmJozJP+7kkwVwhPzY
HPO3OPetBEWNFRBhVAAHoKdRVFFHU7W4u4Vjt5oEGfnWeDzVcemMiqcegiLw6ulx3BRlbzFlWMAK
+/eML0xnt6d62qKQGPcaXezNaXK30SX9uHXzfs/7t1bqCm7PYd+1Vx4ful8PNp0erSxXLStK13Gh
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
gBGXUYwQc5yRntSwaGq6Fc6ZPctMLgyl5doU5ck5x0yM0+bTbq60d7O7vlefcrJPHBtClSGXKknP
I55/KkMku766tNJe7aweW4T/AJdoG3sfmxwQPTnpWgDkA9KxtXt9Wk0I29rcBr93VTPEPKCLuGWw
WPQe/NbCAqigksQMZPemIdRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU
UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAV7u7W1EY
KSSPI21EjGST171Fc3hXTmnEc8ZKn/lmC0fXkjPbFGo2zXMSKsEEwByRKxXHuCBwag+yXiaR9kVo
pJGVlZndsKDnGDgk4zUO+pDbuWjdGK1hk8uWfcoJKKM9OpGeKhXVoXt4ZUjmYzEiOML8zY6nrjH4
1BPaahNYQ22LdVXCyASN86gDjO3jPelutPluBbSNBas8OV8liTGVPoccEY9KG3d2JvLoX7W5S6h8
yMMMEqysMFSOoNQaneSWcAaOF5CWAyBkDkDnkevFRwzw6dGIpokhdiW228TMv5gdeKdOy6nZSJas
Q6spBkjZRkEHuPanfQd7xtfUuQyGWMOY3jJ/hcYIqO6ultvLBR5HkOFRBknvUkJlMQ89UWTuEJI/
MgVX1C3a5jRRDDMAckSMVI9wR0od7aGsLN6hc3ZXT2nEc0ZKn+AFo+vJBPanvcmK3ify5Ztygkoo
9Op54qsbS7XSfsqtHJIysrM7tgA56cEnGabPa301nFB+4CggSASN86gDjOOM96V2XZEq6pC8EMiR
zMZidkYX5mx1PXGKs2twl1D5ke4ckFWGCpHUGqNzYyz/AGeRobZniBUxNkoVPoccHj0q5ZQmCDaY
oYiSSVi+7Qm76iko20I73U7SwdFuZGRnGRiNm/kDUlneQX0JltnLoDtyVK8/iKjvbE3bowu7q32j
GIZNoP14qSztvssRj8+efJzumbcfp9Ksgy/EGoz2sttb288dr5iySy3Eib/LjQAnAz1JIqHTfEY/
4Rc6pqcbxtC5jmVUwchtv3SeOo4qbxBo8mo3FhdQCKSSzkLeTKxVJAccEgHoQD07VXmt9U0nw3It
nibVbifeTGhKK7vluD/CATyfrSQ9NDowcgH1paam4IoYgtjkj1p1MQUUUUAFFFFABRRRQAUUUUAF
FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU
UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR
QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA
BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF
FFFABRRRQAUUUUAFFFFABRRRQAUUUUAVNSv4tOtHmlK5A+VCwBc+gpIb6M2YuLiS3hUnBImDJ/31
xUOvwG40idEiMsnG0Bcn7w6VHqMSxXtjMbdpLaLeGWOPdtYgYO0fQ/nVJKxokml3NLzovLWTzE2N
ja24YOfQ0Qzw3Cb4JUlTONyMGGfwrBSyeTSYontnEUl6JBCV+5GXzgjsMVvxxRxAiKNEBOSFAGT0
/oKTSQpRSK2q3o07TZ7rZ5jIPkT++xOFH4kgVN5ohtlkunjjIA3sThQfx96zvE8btoskiIXMEkc5
UDllRwxA98A1H4nurIeGpp7qA3trJsxEjlfMyw24I/A1JBsSyxwxmSWRI4x1ZiAB+NVNXvX0/TpL
xEEiw4eRf9jPzEe4GT+FUvFE9rD4bme+tGuYDsBtw5UsSwwMjnr/ACqTxFLs8OXa7T5k8RhjTuXc
bVH5mhguhrKQyhlOQRkGlqK1iMFrDETkxoqk/QYqWmxIKKKKBhRRRQAUUUUAFFFFABRRRQAUUUUA
FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU
UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAVtQu0sLC
4u5FZkgjaQqvUgDPFOs5ZprVJLiAQStyYw+/b6c4HasrxdHO+gXTRTiOOONmmTbnzUHJXP8ADkZG
fetqMho1K9CARigB1FFFABUcsMUyqssSSKrBlDKDgjoR7ipKKAI5YYp1UTRpIFYMA6g4I6H6in0t
FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU
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
422e5TwXqZvLWS3uryWZVgYYJeQ4UDPXk9a621iMFrDETkxoqk/QYqSlpgFFFFABRRRQAUUUUAFF
FFABRRRQAUVS1LUY9MgWeeKZod2HeNdwjHq3fH0zV2gAooooAKKKKACiiigDK8T/APIs6p/17Sf+
gmsbxI0sU2jTpKtvA0ckEl0xwIA4X5s+uFIHbOK6uWKOaJ4pUWSNwVZGGQw9CKbb20FtAsFvDHFC
v3Y0UKo79BSsBi+DYI4NEPkIyWzzyvAGzkxljtPPPI5q/rWrQaLpz3tykjxKwUiMAnk47kVoUUwM
/WdXg0bTWvrlJXiUqCIwC3Jx3Iq+DkA+tLRQBga9bRXms6Nb3Cl4HabemSA2E6H1HtXPXETJbWVt
NPFFpcN1dRk3KM8IKviNXww4AzjJxx9K9ApDz1pAcFCbvTfsj6TdRXxvBJawOoIijIYMowSTtUeY
Op7UsFxc6vc20kFsJGurl714J5NgEcaiNQTg/wAWT07V3lLQBx0IuJfAeo6e6E3VkklsyL8x+Xlc
cc/KRWlq9zDq3hG/bTpVulMDAeX82SBnH19q36KYXOU1S+0zUJdLknuI5tHJkWVi37rzAFKB/wBe
veqCMn9laeLx5f7DN7KCzlsGLnytx67M468dO1dyRkc0UAc1qx08eCNQ/sxozaeU4Ty2yuc849s+
nFXfEzWi+HLg38k8VthN7QEBx8wxjPvitG7srW9iEV3bw3EYO4LKgYA+uDReWVvfQrFcxCSNXVwp
JAypyOnX6UDuTRkNGpGcEAjNOoooEFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU
AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA
UUUUAFFFFAGV4n2/8I3qO7djyW+6MnPb9auWH2s2kf28Qi4x83kk7fwzzTb/AE+31GNY7oO0atu2
LIyhv94A8j2NW6ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK
KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo
oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig
AooooAKKKKACiikoAWiimu6xoXdgqqMkk4AFADqKZHIkqB4nV0PRlOQafQAUUUUAFFFFABRRRQAU
UVHNPFAoaaVIlJwC7ADP40ASUUlLQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR
QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA
BRRRQAUUUUAUtTupbS3RoER5HlWMKxwOTiqV1qF9aGGCUQNPKWIeON2VUAHVRznJx1rUubZLlYw5
YCORZBj1ByKjvLJLpon8ySGaInZJGQCM9RzkEU011NIuOlzJuby/uNJWVQtu6zKj7kddx3qAVzgg
HPQ/StBrq4hu7G3mETNOZN7ICAMDIxk1I9gsti1rLPPIGO7zGYbwc5BBAxwfamTaaJkg3XVwJoGJ
SYFd/PBB4x+nandDvF/iQS6nOLIyxRRtKbo26qSQCN5UGkmutThmtbZhZmadnAcBtoAUHpnr171Y
i0uGK1jgDyssc3nAs2SW3Z5OPWrEtqkt1b3DFt8G7aAeDkYOaLoV4/n/AMAi0y5kurTfMqrKrtG4
XplSRkflUWt31xYWcclrEks0k0cSo5IB3NjqOnWrdtbpbI6oWIZ2kOfVjk/zpt5aR3iRLIWAjlSU
bT3U5H4VL3IdruxhX+r6npzW1pOts93cMzCWGCWREjUDJKLlicnHXHf2pkniC+Gk287Wy28jTtDL
NLBKY0ABIfZgNtPHXGM89K2tQ02O+aGUTTW9xASY5oSAy56jkEEHjgjtUbaZKbWOJdUvlkRixmDI
WbPYgrjH4UgK1vq8kkmkpvtbgXvm75YCSnyjIK/1B6VQ154tV8JanNcwRM9s8yRHGdpRioYeh4rS
Ph+3FraRQ3NzBJauzpOjKXJbO7OQQc5PaprfRbWDSZtNJllt5t+8yPljvJJ5/GhgtLFXxK99HpkT
2cscQ82IMWDbsmRAMEEcevqKdrwnHhLUvtTRtL9mkyYwQvQ44JNWG0hZdLexuLu7nViCJXZRIpBB
GCAOhAPSnXWmtcaJcae93LI00Tx+fKAW+bPJAAHGfah7MS6GB4hkhg/sizdX+zPG7C3hYp50gChE
+X3bP69q0vB73R0Uw3r+ZPbTyQFtxb7rY6nk46VPPo5u7az+1XBW9tCTHc26BCuRg4DbhyODnNW9
NsIdNsktoC7KpJLu25nYnJYnuSTmn1YdEi1RVDWtJg1rTnsrl5EiZgxMZAbg57g0azpFvrOmtY3L
ypExU5jIDcHPcGgDQrI1/UbjToYGgVFEkm15pI3dIRgnJC89sdRjNawGAB6VVvrR7tUEd5cWjIc7
oSvPsQwINJgjMvbua58Jz3SvZXQMMhl8st5ciAHIUg5BP145qe7vJLPQ4buKS2t4kiVn85WYAYGA
MHJOePeh9BiOkDTY7u6hhO4SMjKWk3Z3biVPUknjFRzeHUntrWGXUr9vssgkiYmPIIGBkbMHHbIz
zT7h2KU+valb2mnRz2scN/eB5GAiklWFFx1VfmJ5A9jTNTupNU8D6hLe2vlzRq64aJlBI6OoYZAP
Uela82jCaK33X139ptyxjugVEgB6g/LtI6cEdhUeoaRcXWiSadHfuTLkST3CeYxU9QACoHaga6Fv
UZbyHTHk06BLi6AXZG7BQ3IzySO2auDOBnrWX4g06fVNIaxt5REZGQO5JBChgTjHfArTRQiKozgD
HNAug6iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo
oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAxvFVss2h3EwQma2UyxMpwyMO
4P0rQsb231C1S5tJBJC4yGwR/Oquv2t1f6ZJZ2qQkXA2SPI5Gxe5AAOT7cVpAYAA6CgBaKKKACii
igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK
ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA
KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo
oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii
igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK
ACiiigAooooA/9kKZW5kc3RyZWFtCmVuZG9iagoyMDMgMCBvYmoKPDwvU3VidHlwZS9JbWFnZQov
Q29sb3JTcGFjZS9EZXZpY2VSR0IKL1dpZHRoIDY3MgovSGVpZ2h0IDg0NQovQml0c1BlckNvbXBv
bmVudCA4Ci9GaWx0ZXIvRENURGVjb2RlL0xlbmd0aCA1OTQxND4+c3RyZWFtCv/Y/+4ADkFkb2Jl
AGQAAAAAAf/bAEMADgoLDQsJDg0MDRAPDhEWJBcWFBQWLCAhGiQ0Ljc2My4yMjpBU0Y6PU4+MjJI
YklOVlhdXl04RWZtZVpsU1tdWf/bAEMBDxAQFhMWKhcXKlk7MjtZWVlZWVlZWVlZWVlZWVlZWVlZ
WVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWf/AABEIA00CoAMBIgACEQEDEQH/xAAfAAAB
BQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiEx
QQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNU
VVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6
wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAA
AAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgU
QpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZn
aGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS
09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/APRaKoasrC0E8eS9swlAHcDq
PyzWZIRNZ/bJtwgubkGTqMRDIGfbofxocrGUp2djoaZBL50KybHj3fwuMMPqKyLNrRYb4MyjTvMA
j3H5M45x7ZqpFcQy6NZRvKGhSQC4Abopzjd7ZxS5ifafqbyXSSNcKobMBw2e/GePzqjaatNd6ENS
SxILJ5iQmUZZeuc9B34qPSPI26l9lIMHmfLjp90dPao9CI/4Qm0ORgWQ/wDQaL+7cuD5rX8zV0+6
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
UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR
QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUVFcTxW0RlmcIg79aqzapbpZSXKFnC5ABRgdwGcHji
k2kJtLcv0VViv4JLRrncVjUfMSpGPzFNj1OzlOEmB+YKPlIyT0xxz0PNF1sLmXcuUVBJdwRrMzyq
ohwHJ/hyMj+dVptWtks5Z0LPsyNpRgc4yAeOPrSbSG5JGhRUFrcx3cIkjJx3ypHOPcU64nitojLM
4RB360wTTVyWiqE2qW6WUlyhZwuQAUYHcBnB44p66jbG1+0FyqZAOUbOT2Axk0XQuZdy5RVCbVbd
LKS5jYuFyANpB3AZweMj8asWtzHdwiSMnHfKkc49xRdMOZXsT0VFPPHbxGSZtqDjPWq02pwR2b3C
EuFyANrD5gM4PHFJtItRb2L1FVF1C3Nt55chMheUbOfQDGTTJtTt0snuI23hcgDafvAZweOPxock
hqMn0L1FZ02pxrBDMhAjaUI5ZSMDBPFWI762kRXWUYZ/LGQQd3pjtTug5X2LNFVbm+ht4ZnJJMXB
ABPOMgUzTLp7u28yRkJOOERlxx056/WldXsHK7XLtFQz3MFsoa4nihDHAMjhcn8aLe6t7rd9nnim
29fLcNj8qokmoqOSaOJoxI20yNtX3PpUUt9bQ+b5koXyiA/B4J6D3P0pXFdIs0VWS+t5LZp0kzGh
w3ynIPoRjNRxX0a6dHc3MseG/ijBwTnsOtF0LmRdorOttUjlS9nd1W2tj9/BGFC5JI9uauwTR3Nv
HPC4eKRQ6MO4PQ0J3GmmrokooopjCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA
CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK
KKKACiiigAooooAKKKKAKmoxeda7fJeb5gcI+xhg9QfUVWggu5NMu4Zy+6QMsQlYFgCMDJHHXNaT
uqIXdgqqMkk4AFQR6hZTWzXMV3bvbpndKsilFx6nOKlx3Jcbu5WnS4utGlha2aOYptCF1OencGpN
TgkkghMCb2hlSTYCBkA9BUqX9nJbrcJdwNAxwJBICpPpnpUcmq2Mentffa4HtlB/eLICpI7A5wTx
Q11Ycmlii9peTrcTGALIbhJkiZx8wUDgkfSr0nn3ljcxtbtAzoUUOwOcj2zVfSdZS+01r64+zW0Q
AbK3IcKpAPzHACnnpV6O7tpbb7RHcRPB181XBX8+lHL0Eo2IYbxYbdBe7LR8YCySL82AORzUd3Nb
31uY4GW6YENthmAZcHqDntU6XdjciUpcW8ogJEhDq3ln39KSC8sHtnuoLm1a3X70qOpUY9SOKHru
HK7WK0EF3Jpl3DOX3SBliErAsARgZI465pJ/tstjEFgliZHUSIkqhmXHOGB9fpVs6hamwkvY545b
aNWcyRsGXA68j6UyzvGbSory/wDLtS0YkcM2FjB5wSfQUcocmm5TtbK4+yaijRtG1xnyxJJvP3cc
nJrRs3la3UTQNC6gDaWDZ468VXudZsLfTZL8XUMsCKxDRyKd5AJ2qc4J46VNHqNnJaNdLdQeQoy8
nmLtTvyc4HWhKw1CwahF5ttt8p5SGBAR9rD3B9qrRQXUmmXUMxbe4ZYxIwLAEYGSPen6ZqkepTXi
w7Gjt5AiyI4YSAorZGP97HfpV53VELuwVVGSScAChx6mik0rGdP9rls4gsMsRVx5iJIoZlx2IPr9
Kjt7Oc2eoI0bRtPnYHk3nlccnmtC1u7a8i8y1uIriPON0Thhn6im3809vZyS20KTSIM7Hk2Ajvzg
/wAqTit2NTeyKd0l1PaWxFqwkhmRzGXXkAeucVFJa3UjPdeQQxuI5BDuGSqjHXpmrtlqEdxpNvfy
7YEmiWQhn4XcAcZ49aW2vlfT4bm68q2Mg5UzKyg+gYcGm466gqjS0RBHDcSQaiZIfLefOxSwP8AA
q7aI0dnBG4wyxqpHoQKbDe2s8KTQ3MMkTttV0kBVj6AjqaebiBX2NNGHLbNpYZ3Yzj645xTSsJyu
V9SspL2ONY5o4irZJeFZM/gelN0yxkshJ5k0Uu/GNkCx4x9OtXFljd3RHVnTAZQclc+vpUN/NPb2
ckttCk0iDOx5NgI784P8qNidxupW7XNk6xf65cPGf9oHIqiLK5FnFM0Qe6+0faJI9w56jAPTgY/K
rllqEdxpNvfy7YEmiWQhn4XcAcZ49aW2vlfT4bm68q2Mg5UzKyg+gYcGk46kOClqQWy3ETXd01q2
+d12whl3AAYyTnFVYLa8WwtEa0YSWkgcqXX5xznHPUZ71qw3trPCk0NzDJE7bVdJAVY+gI6mnm4g
V9jTRhy2zaWGd2M4+uOcUcouRGNcSyWWlaze3dqqqys6wyEMHG3GDj1/rWlpRkbSrQywJbSGJcwo
MLHx90DtirKyxu7ojqzpgMoOSufX0qK9vILC1e4uZEjjQEkswGeM4Ge9NaIuKtoWKKytJ1lL7TWv
rj7NbRABsrchwqkA/McAKeelS3Os2Fvpsl+LqGWBFYho5FO8gE7VOcE8dKew9zQoqompWT2huhdw
eQv3pDIu1e+Cc4HWo7rV7G201783MUkCqWVkkU+ZgE4U5wTxRsC1L9FUxqVo1hLeJPHJBEhd2Rg2
3Ayc474qKLUhDosd/qXl2xaPzGUtjbkZC89Tj9aT0Dc0aKydK1lL7TGvrg21tCAGyLkOFBAPzHAC
nnpU2mapHqU14sOxo7eQIsiOGEgKK2Rj/ex36UwNCiiqWq3402z8/wAppmZ1jSNSAWZmAAyeByet
IC7RVWK6K2RuL6NbLbkuJJFIUA9d3THeobnWbC302S/F1DLAisQ0cineQCdqnOCeOlMDQoqompWT
2huhdweQv3pDIu1e+Cc4HWo7rV7G201783MUkCqWVkkU+ZgE4U5wTxRsC1L9FZk2s2yQW00MkU0U
0yxMyyjEeQTkkZ6envVyG8tZ4UmhuYZInbaro4KsfQEdTQBPRVW7v7Wzt5pp540SEfNlgMHGcfXH
aqFhq9xqOizXsEFv5wTfFEk/mZ+XIDEAbT7c0rhY2aKr2N1HfWMF1Fny5oxIufQjNWKYBRRRQAUV
R1XUV022WTynnlkkWKKJMZdz0HPA7nPoKZo+rR6rFORG0M1vKYZY2YNtYe44IpAaNFFRyzRQJumk
SNc4y7ADP40wJKKqjULJrQ3a3lubYdZhKuz/AL6zikfU7BLVbl722W3c4WUyqEY+xzigC3RVZL+z
eGWZLuBooSRI4kBVCOuTnimS3gm0yW6014bpgjGPa+5XI7ZH5UgLlFVrS9hu9OhvVYLDLGJcscYB
GeanR1kRXRgyMMhgcgimA6iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo
oooAKKKKAMbxPbyXGloEga5jjnjkmgUZMsatlgB39cd8Vm6zGmpWEMtlaXcMMN2kk4S12SOAp5CO
vzYJXsenHSuropAcX/Zsc0KtDHfXKTajC8wubURggDlgoVeMYySO1aQsNsXiKMWx8uZy0SbOGJhU
EqO/Oeneuiooa0t/XT/Iaetzl7mzaLw/ox+xO6W7wyXMCR5YgJg5XuQSDj2qB7SS40fxG9vZzRQX
jZhhMRRm+UBmCdRkg9smuvopvVtiWljn9e0uJNKRbOwR445YmmgijG6WJGyVx3x1x/jVTWY01Kwh
lsrS7hhhu0knCWuyRwFPIR1+bBK9j046V1dFIDlbfTVuNF1tLR715LxGH+lQCHc+zGVUKvXgE47V
avnt9U8MW8x+0qjeXIPIi8x42BB5TBzgjBGK6CkoA5m3hur/AMNarFLaqZH81YD9m8lpfkwGKHoc
5GeOgpLwrc6dp08en3PkW10j3Fu1syuQFIzsI+bBIPGentXUUUf8D8AOW0maS0ttevrXTLhVa4Ms
Nu0TRtLhFBIGM8kE9Ks60LjUfD1rM1lI2XhnuLPGWKAgsmDjJHp3xXQUUAZAv40028vNP02dnjGf
KMDRNMwHYEZPpnFW4nkvtJR5IWglnhyYm6oSvQ9OlXKKGr6Ac/pF2kPhyCC7srwPaxRwyxtauxLA
Y+UAHcMjqMismzhe68OaPYvY3W63uYfOjmtnUBcnPUYI9a7ain1uHSxyN9Zy2815NFaymCPVILjb
HGSSoRQzKB15znHoaZOJ7621cJp1z5l7dILYyRsmzEagSk/wgYz68Y612NFK3T+un+Q79TnNLe40
nRr5GsJp762ZncgH/TGPIdWwc59OcYx6VrxPJfaSjyQtBLPDkxN1Qleh6dKuUUPVWEc/pF2kPhyC
C7srwPaxRwyxtauxLAY+UAHcMjqMismzhe68OaPYvY3W63uYfOjmtnUBcnPUYI9a7ain1uHSxyN9
Zy2815NFaymCPVILjbHGSSoRQzKB15znHoaZOJ7621cJp1z5l7dILYyRsmzEagSk/wAIGM+vGOtd
jRSt0/rp/kO/U5zS3uNJ0a+RrCae+tmZ3IB/0xjyHVsHOfTnGMelaFyX1Dw5I8tqUlmti3kMuWVi
v3cY6846Vp0UNXVgTs7nN3FjEPCVnDNFcQsiQsfs8G90dcEEpg5wRyMUy3hur/w1qsUtqpkfzVgP
2byWl+TAYoehzkZ46CunopvW/mJaW8jmL24abRbY2llcQoJ0WfdZEyRjH3lRhyc4GQD364qtYWE0
2jeIY/s9wzTs5g+0wrGzkxABsAADJ9h785rsKKT1uC0sYUiDU/C95b2ttLbySQNFsmhMR3bfQgZ+
tTNJHqnhdpI4vMEtqdsZXJDbSMY9QeK16Sh638wWljmLmzaHQ9DY2bvHbPDJcwJFlsBCMlepwxBx
14pNJuUsLXxBqP2Ka2thM0yRyxGIuBGuSAR3IP511NRTwRXMLQ3EaSxOMMjjIP1FN6tsF0I9Puje
6fb3RiaEzRh/LbquRnFZXim3a5gtEliuJrDzf9JS3BL4wdpwOSA2Dx6VugYGBS0MEcSjX2oWVzFq
ov1hgMQgkS0JaQq7ESlCp54XK89M4Gav28N1f+GtViltVMj+asB+zeS0vyYDFD0OcjPHQV09FId9
bnMXtw02i2xtLK4hQTos+6yJkjGPvKjDk5wMgHv1xVawsJptG8Qx/Z7hmnZzB9phWNnJiADYAAGT
7D35zXYUUPW4lpY5PVCl5oli0Om3RSG8haaA2rBiF5b5SOR79KrzQSs1xqFvZXCWn9owTiIQkOQo
AdwmM9fbPGa7Sin1v/XT/IPI5q3SS+tfEMj2cyrcMTCk0RDOBCqggH1I/wAmr9i0WleGYZZ4xAIL
VWlG3aQQgzketa1JS6WHczfDttJZ+H7GCYbZUiG5fQnnH60a1YPfxRKkNtNsbJE5YAcdttadFN6i
RzH9gT+SU+xaXy4bG+XHQ/rzWlounyWAmDwWsO/GPs7Oc4z13Vq0UAYHi63vJbC2msd3m29wshKJ
vZVwVLBe5G7OPaqmiiPRtO1jUUtZYLNTvijlUo7qiAFiDyCxB68966qop4IrmFobiNJYnGGRxkH6
il3Hcj0+6N7p9vdGJoTNGH8tuq5GcVn+I7U3cNhGIDOgvYmkXbuG0E5JHpWwBgYFLT6i6HI3tvcW
smoCC2dbeW/jZmS280onlLl0TBBO4Yzg45qpY2E0tyd9tdPA9+0m6eAISptiNxUAAZPsOcZ5ruaK
VtLDueftpF0LS3xbXMcMUdm8yxRAudqODhWBDFWKkjB+lb2km106z1O/Ml6YyfMka6gEOSF6qoVe
vA6ckV0VJTet/MRgW0S6b4GCahEWWKzJmi3YJ+Ukrkd+cVpaM0b6NZNDA1vEYU2RMSSi44GT7Vam
hjniaKaNJY3GGR1BBHuDTwMDA6UALRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA
BRRRQAUUUUAFFFFABRRRQAUUlMgmjuIVlibdG3IOMZpASUVEtxE5mCtkwnDjHQ4z/KqUGsQ3GkHU
ooLkwY3BfL+dl9QO4ouC1NKiobO5jvLOG5hz5cyCRcjBwRkU6SVIigdsb22Lx1NPYNySiikYhVLM
cADJJpALRUNtcxXSb4WLL6lSM/nU1ANWCiiimAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF
FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU
UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAFHVX
khtluI2YeQ4dwP4l/iH5HP4VnvcyzRef9oeOC5uhGrK2NsYyMj0yR1rdZQylWAKkYIPQ0wwQmHyT
EhixjZtG3H0qWiJRbe5nWeXN9bNcytDE4CSb/mGRkjd7GqyXMkmk6eGuHXzpAksob5sc9+2cAVr/
AGS2EHk+RF5I52bBt/KkWxtFR0W1gVH+8ojADfWlZk8j/Mz9MVUOpqsrSgSY3M24n5R39ulRaF/y
JVn/ANeQ/wDQa2IraCFGSGGONW6hFC5/KqkOjWcGmNp8QmW1b+Hz5MgccBs5A46A4/OnbSxpBcth
nhv/AJFvS/8Ar1j/APQRRrf+qtcuYwbhAWBwQOec1etreK0toreBdsUSBEXJOABgcmgrBdRAsI5o
zyMgMDTn7xUHytGOZ5IZTEk8jwx3cah2bJwRkqT3Gammb7Vb6oPOcpGTt2P6IMj6ZzxWiLW3EBhE
EflHqm0Y/KlS3hjRkSKNUbqoUAHtzUcrtY051uZ6RiHw9IftUkG623GZiW8r5OoHt1xVrSmD6XaM
tybsGJf35GPM4+9j3pb6xivtOmsnLRxSoYz5eAQp444qW3gjtreOCFQkUShFUdgOBWhm3cloopOn
WgQtFFJ060ALRTHljj2+Y6pvbau443H0HvT6ACikqG2vLa8VmtbiGdUO1jE4YA+hx3oAnoopOnWg
BaKKKACikpsMsc8SywyJJGwyrowIP0IoAfRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA
FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU
UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAUdVnaC3QRySJLI4RPLjDsx64APHQHk1mxaleKqxy
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
68Wzs7eXyALWVH3K5O4DOe3XkUX9s1u8t6ZooytwsqF87cbAhDYHHfmhthy027GhZXqXgl2JJG0T
bGWQYIOM1NPIYomcI8mP4UGSazdCaSUXlxJtIlnyrJnaQFA4z1HbPtWjcGYRH7OsbSekjFR+YBqr
u1zKcUp2M86hJFoS3aeZcuYywfYBzg8sM8D6VetJ2uIQ7QyRH0cAE8deCeKo2ljdLo0lhP5K/ujG
roxbOQeSCBU+y/bTnTMEV1jCMhLL9Tkf40XZclHZdy9RUVusq28SzsHmCgOw6E45NS1RgwooooAK
KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo
ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAGPIiYDMATnAzycelNguIp0Vo3B3Kr47gHpkd
qr6nY/b4BEXCqDk/IC3tgnp9cVnR2E+n6WLWE7pbnamQgzGSPmJYdQOcVF3fY2jCMo76mnYXTXkc
koUCLeViI/iUcZ/PNW6jhiSCFIoxhEUKo9hUlUZSab0CiiimIKKKKACiiigAooooAKKKKACiiigA
ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi
iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK
KACiiigAooooAKKKKACiiigAooooAbI6RoXdlVR1LHAqGG5VrVJp9kO7sZAQPx6GnXLokJMkbSL0
2qhcn8BWHDG02lWNs1tNmKdPMV4iBjJ9RyKlvWxEpWfyNia/torRrnzo3jAOCrg7iOw96lgniuIw
8MiuvfawOPbis1rMmLVY0h4k5jG3gkoOR+NXdPdHtl2QvDgAFXjKHOKE2xJu+pYZlRSzsFUdSTgV
GLmBldhPEVj++Q4wv19Kh1VGl0ydEUszLgBRknmq2p2SiCHyIcIkilxEgLbQDjjHOCelJto3jFPc
0PtMHk+d50flf39w2/nR9ohMPnedH5X9/cNv51jGIpC7wrcMskymRntxlePvKuPpzio44ZArSNBM
8K3QkKtHhmXbjdtA9falzsr2a7mvBfRTfaG3IsULbfM3jaRgHOfxqYXELQmVZozGP4wwx+dYywrJ
b3bGC4hja4DoFhyeAOdpHIzVuzkZbKU3MBZTIQNsBBccclaFJ9QcF0LcdyptUnnKQhhzmQED8ehp
63MDRtIs0ZjX7zBhgfU1k288kOhpGLSZ50AXY8LYBOeenIHtTJLUfYIhDHOQkweY+VhnOPvBSOec
cUcwciNuOWOZA8Tq6H+JTkU+s/S4kTz3QznewJ82MJk46gYFM1qwe/iiVIbabY2SJywA47batPQz
as7GnVXUbz7DamYW89y2QqxwLuZif89aqaLp8lgJg8FrDvxj7OznOM9d1Xry4W1tnmaOaQDjbDGX
Y59AOaGJGadfjOiWuopbSu10VSG3GNzMTwM9B0Jz6Cm22vveWsrWunzS3UM5t5YFkT5GAzktnGPf
1rn1jvpfCOmrbW93BdafMrSCS3YMBhgWVSPmIDZ4qeyebRdO1C603S7orcTpHbRNCxbAQKZXUfNg
kE9Mn8afcdtjobDWI7m0uprmJrN7NitwkpB2YAbORwRgg5pdH1eLVdPe88p7ZEdkYTcFdvUn0rGt
9NlvdIWK0eUSfaRNdvf27p9pbr93g7c7eBxgYpdPW4stA1x9YhRoPNuHMahkLqc55PY9iKXcDqEd
ZEV0YMjDIYHIIp1UdGaN9Gsmhga3iMKbImJJRccDJ9qvU2SFFFFAwooooAKKKKACiiigAooooAKK
KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo
oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAqC6uktfJ8wMfNkW
Jdo7npn2rP115LU2t5CpaSN2j2jvvGBn/gQWsiUSahIsl4vzLdQ2rgcAlc7iPYk1UY31NY07q7Ot
qq14RYi6FtcHjJiKgOB7gms63SztU1K3nKR2aTLhXOFXKqcD8aXQ547nw+kMcqyTLEQyg5IJzjNF
tLi5LamtbTrc20U6AhZUDgHrgjNS1y0tws2gWMMcyhIjGl0CCdg2kYcAg4yOa0tBjjjS4EF1DPEX
GFhUhIzjkDJPXrQ42uEoWVzUlkSGJ5JGCoilmJ7Adaof2zbx6NFqV2Ht4pQpVSCzfN90YHc8cUuv
wyXGgajDCC0j27qoHc7TxSpqFlHo0F9LNHHamNGWR+AMgY/nUdzMVdTjm0Y6laRvPGYjKifdZgO3
PerVtPHdW0VxC26KVQ6n1BGRWB4S1C0bwlCwnRhaxHzsH7mMnn8KveGIpIfDenRygq4hUkHqM8gU
+rA1qKKKACiiigAooooAKKKKACo5oY54mimjSWNxhkdQQR7g1JRQAgGBgdKWiigAooooAKKKKACi
iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK
KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo
AQkKCT0HNVNM1CPU7UXMMUyQsfkaRdu8Y4YD0+uKNVN4NPm/s8Qm42nHnEhentUWgbP+Ef07yt3l
/Zo9u7rjaOtC6gaNFFFACUdOlLRQAVHDDHBGI4Y0jjGcKgwBk5PFSUUARzQxzxNFNGskbjDI4yCP
cU+looAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA
CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK
KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAEIBBB5Bqrp+n2+m232e1Eiwg
5VXkZ9vsMk4HtVuigAooooAZJLHHt8x1Te21dxxuPoPen1heKTKLfT/IcRym+iVXK7gucjOO/WqZ
1S/tLlrKW5Fw0V/BD5xjUF45BnBA4yPUY7Ulr/Xp/mDOoqG2vLa8VmtbiGdUO1jE4YA+hx3rFvbi
6u7XX4Y7ow/ZTtRlQEgeSGI59yeateGbd7fQrMPN5u+GNh8irtG0ccDn8aFqDNeiszWr97CKJo5r
aEu2MzqzA8dttN0XUJL8TeZPazbMY8hXXGc9d1MDTZlRSzEKoGSScAUyOeGWLzY5Y3jH8asCPzrH
8TIk7aVaz82094qyqejgKzBT7FgOKy9SNrK66eLH7DC2oxR3KjaFmUglfu8YOF9+1IDrYZ4rhN8E
qSr03IwI/SpKqJb2OmRzTJHb2kZAaRgAi4Hc9qr6zfPB4fur2xkRmWLzInGGU+h9xTBGnRXM6nPr
Gl20Ki8a8uL2ZYl2QIph4YttyQDwOAx/E0z7fqsFjLFeG7imedY7WTyYmmlBBJG1W2AjB5OBikB0
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
KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo
oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDI115LU2t5CpaSN2j2jvvGBn/gQWsiUS
ahIsl4vzLdQ2rgcAlc7iPYk11pIUEnoOaqaZqEep2ouYYpkhY/I0i7d4xwwHp9cVSlY0jU5Vaxn2
6WdqmpW85SOzSZcK5wq5VTgfjS6HPHc+H0hjlWSZYiGUHJBOcZrbopN3VhOdzlpbhZtAsYY5lCRG
NLoEE7BtIw4BBxkc1paDHHGlwILqGeIuMLCpCRnHIGSevWtajp0puVxud1Yz9fhkuNA1GGEFpHt3
VQO52niqWqxW+q+EZJEiE6taGSAYJOdhxgevNb1RwwxwRiOGNI4xnCoMAZOTxUW3ITs0zk7p9LbQ
rM2TR/2YbpBe+STtC7eQ+OQM7M/rUQ8seH/EQ05yNODYtWQnaPlG7YfTdnpx1xXaUdKfcXY5LxBp
MGnadELIC3t5p0F7I29wyANy4BBIJIycj3OKo/6NbaRNHHd6fd2M92iHajrbWp25JIDnIJxxkDLV
3dGBjGOKQHn1tJH9ililmR9ITUkWYxKyRCMxg8AkkIXx3xznoa2PC82nwx67NZuv2CO5JVgcqAI1
zj2649q6ntimTQxzwtFNGkkTDDIwyCPcUWAzfDEUkPhvTo5QVcQqSD1GeQK1qSlpsAooooAKKKKA
CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK
KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo
ooAKKKKACiiigAooooAp6qbwafN/Z4hNxtOPOJC9PaotA2f8I/p3lbvL+zR7d3XG0da0CAQQeQaq
6fp9vptt9ntRIsIOVV5Gfb7DJOB7UAW6KKKACiiigAopOlLQAUUUUAFFFFABRRRQAUUUUAFFNV0d
mVWVipwwB6H3p1ABRRRQAUUnTrS0AFFMSWOR5FjkR2jO1wrAlTjOD6cEU+gAooqG5ure0hM11PFB
EDgvI4UfmaQE1FMjkSaJZYnV43AZWU5BB7g0QyxzxLLDIkkbDKujAg/QimA+iiigAooqG5ure0hM
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
DjjjP40XA6eiq1g0rWFu08sc0xjXfJEcozY5I9s1ZpgFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF
FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU
UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUARTzw20fmTyxxJkDc7BRk9Bk1I
DkZFV7+FLiwnikVGVo2BDjjp3qh4Wu/tegWZ8maIxwoh8xcBsDGVPcHGQaANiiiigBksSTRPFKoe
N1KspGQQeoqgND08WBsvKdrfcHCtM7FSMYKsTlcY4wRWlRSAoRaPYxWM1msJMM5LS7nYs5PUlick
/jU97ZW9/bmC6jEkZIOMkEEdCCOQfcVYooAzDoOnm2MDRyspkEu5p5C4ccAhy24fgaRfD+mLayW6
2xEcsglY+Y27eMYbdnIPHUGtSimBS03S7TS0lSzjZBK5kkLSM5ZvUliTV2iigAooooAgubWG6EQn
Tf5UglTkjDDoeKgudJsrpJ0mhJE7rI5DsDuUAAgg5BGB0q9RSAzbbQ9OtSDDbkMJDLkyMSXKlSxJ
PJIJ/n1p40ewFvJAIMRSRJCy7m5RRhR17Zq/RTAr3tlb39uYLqMSRkg4yQQR0II5B9xVQ6Dp5tjA
0crKZBLuaeQuHHAIctuH4GtOikBlr4f0xbWS3W2IjlkErHzG3bxjDbs5B46g1G2gWsWkX1jYlrb7
aG8yRmaQlmGCTuOTx71sUUBcgsrWOxsoLWEERwoEXPoBip6KKYBRRRQAUUUUAFFFFABRRRQAUUUU
AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA
UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUVT1WzivtOmgljEgKkqM4ww6Ee+a
q+GtQi1DRLV45TLIkSpKWzkOBg5z3yDQBrUUUUAVdQhuLizkhtZY4ZHG3fIhcAHrxkc0+ytls7G3
tVJZYY1jBPcAYqeigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA
CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK
KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKp6pA1xp8yJL
NE4UsrwuVYEcjp/Ko9DvVv8AR7ScTJNI0KGRlI+9jnOOhznigDQooooAqakLlrGVLOOKSZ1KgSuV
UZ75ANLptr9i021tSQTBEsZI6HAAq1RQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB
RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF
FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU
UAFFFFABRRRQBU1KWaKxlNvby3EpUqqRlQcnvkkAVFomnppulW1uIo45ViUSlAPmfHJJ7nOeatXN
zDawmWdwiDuf5Ad6rtei5sZZrCWMtHnPmIeCOoI4IoS6jSbL1FUYL9BpUF5dMsYeNWbAPUjoB1pw
1K0Nq1yZdsSttJZSDn0wRnNOzDlZcoqC1u4LyMvA+4KdrAggg+hB5FT0hNWCiiigAooooAKKKKAC
iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK
KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo
oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAM3WrSS6hgaJTIYZRIUV9hYYI4PY85pLC0Aiuj
9nmt2m4Jmm8xm4xnqcen4Vou21GbrgZqhod1dX2mQ3l0sKG4USIkeflUgEAk9T+VO+liud2sVUgn
bRo7W4sJS0ARR5cygsV/iU54xjPOKhexv57GMzCWRobnzEjeUCQpjGNy8ZySetdDRT5mV7Roz9Lt
xF58n2aaBpGGfOm8xnwOvU49OtaFFFS3chu7uFFFFAgooooAKKKKACiiigAooooAKKKKACiiigAo
oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii
igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK
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
u/2dHh8hWxu2LjHrzx70dGHVE1g0rWFu08sc0xjXfJEcozY5I9s1ZqCytY7GygtYQRHCgRc+gGKn
pvclBRRRQMKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK
KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo
oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig
AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC
iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooApa
pqC6daCYxPM7usccSYy7scAc8VQvddl0zT/P1Gzjt5nlEUSC4BRyRnJcgbQOckjt3q9q2njUrMRC
VoJUdZYpVAJR1OQcHr9Kqz6VeXdsn2q/jN3DKJoJY7faqEDGCpY5Byc8jr2pAUovFaS2rNHbJNcL
cpbmOC4V0Jf7pV+hH5d6nfWbyTS9ReOxWO9siyPEZsqPk3Bg2OeCOMCpm0q6uI4ReXkTvFcpcAxQ
bBhf4cbj+eanOmf8hT99/wAf5/u/c/dhPXnpntSez/rt/wAEatcydLvbnT9BtZZoJ7i6vGjWJZLo
yeY7LnJJ+4OCcDpVz+3zHp2oz3No0Vxp5xNCHDA8Agq2OQQfQVLcaO0ml2VtFcmKeyKNFNsyNyrt
5XPIIJ4z3qIaE72GoxXF2JLm/OZJlj2quAAAFz0AHrVPdiXQWTWbq2tHmvNLeIsyJbxrMrtKzHAU
9NpHfqPc02912XTNP8/UbOO3meURRILgFHJGclyBtA5ySO3er2raeNSsxEJWglR1lilUAlHU5Bwe
v0qrPpV5d2yfar+M3cMomgljt9qoQMYKljkHJzyOvakBVj8SLc6LqtzEsQuLFGJEUwlQnblSGHUf
gOhqxLdL4f8ADlu7fvigSPc8gUM7EDczHoMnJNWU0+eawurXUbiKcXClD5UPlhVIxjGT785pqWt+
2iw2z3EC3aKqvI0fmI+OOV46j8qP+ABVv9S1EeHbu7itYo50RyClwHVQFJDqdvPPYgVJJqt1bWFu
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
zgneF4HkQOY3+8hI6H3FT1W06Ga30+3huZTNOkarJIf4mxyas03uSgooooGFFFFABRRRQAUUUUAF
FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU
UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR
QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA
BRRRQAUUUUAFFFFAEc80dvC8szBI0GWY9qqLq9g0UkguBsjxuJUjOemOOc4PTNO1eCS50u4hiXc7
pgDOM1DrNnJcwW5hQuYJRJ5avsLDBHB7HmmrdS4qL3Fn1m1jsJbqNjJs3DbtYHcBnB4yv41NDqNt
LDHJvKh3EY3KRliOnIqnFYs+n6giW0sEtwhQefNvL/LgEnJx1xRdJd3NhbN9kdJreeOQxF1JcDrg
5x37+lVZFcsdkaD3lvGs7PIAsBxIcH5eAf5EVXGtaeUZ/tACqQCSrDrnGOOQcHkVSe0vLmx1Xfb+
XJcsDGhdTkbVHJzjtV7U7aSdbMQoCIrhHYZAwo60rIXLHqWLS7gvIzJbvvVWKnIIIPoQeRVTWdSG
lxW0zsixPOscjOD8qkHkY78VNZwPFeXzsuFlkVkOeo2KD+oNU/EdtdXFraNZwfaJILuOYx7wuQpy
eTxUvdfIhpXdizBrNhcQrLHcDa0ogwysrCQ/wkEZB+tJfava2VtdTO5Y23DqqkkNt3AcD0xzWHPp
+oztcaiLJkka9gnW1Mi7ykYwcnO3cevXsKu2lrfS2+uPcWvkSXjEwxl1Y48oKMkHAOR/+vrUvZgt
yfQdSn1HSjdTSQs7KGAiidAmVBx8x+b6jiqdtq99H4b0+6cpd31+yLErDy0UsM847AAn3rXsIZIN
FtoJFxLHbqjL1wQoBFcyLC61HwZpcVslxDdWTR742QxSHC7XClsc4Y4PSqe7sJa7m34d1r+2IboO
sQmtZjC5iYsjY/iUkdP8K2KxfDtjLbG8nlthZrPIoitwwJjjRQq5xxk4zgE1o6i91Hp872EaS3So
TEjnhm7A8j+dD0As0VnvLqQ0LzUt4jqnkBvJJ+TzMcjr0z7/AI1ZsmuHsYGvEWO5aNTKi9FbHIHJ
7+9ABeXkFjbNPdSCOJcDOCSSegAHJPsKgi1W0msnu45H8mNtrZicMp44KkZ7jtTNct/tOnGP7LNc
4dWCQyiNwQchlYkcjr1qppbapa6bO11Bc3TmY+TE8kZlEeB95shc5yevSl3AtWmpp/Y0F7dyxOHU
Ze2R2QknsMZxQmu6a9pNdC6XyYX8tyVYEN/dxjJPPSsay/tuz8KJZ22mSR30SrGGaWIjknLL82Dg
djjrST6RNNo9pFDp9zCbO5ExikuVWWfg5bejH5stnJI5FNgbLahHqGl3M2m3WySMEbmjOUYc4ZGw
R+PrTtNvvM8P2t/eOF3WyzSvjAHy5JxWfawrZadqNw1hfQPMMESytcyycYBwCx74/CnRS/2d4Fjk
uIQTBYDdDKvBIT7rA+/GKXRj7G3BNHc28c8Lh4pFDow7g9DUlU9KMjaVaGWBLaQxLmFBhY+Pugds
VcpvclBRRRQMKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA
KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo
oooAqalJcxWMsln5PnINwEoJUgckcU+wuPtlhbXO3Z50Sybc5xkA4pmp3UFlp881zJHHGEPMhwCc
cD8fSqXhezaz0GzV5ppGeJGKytny8jO0egGcY9qF1BmxRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB
RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF
FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU
UAFFFFABRRRQAUUUUAFFFFAFXUbia1s5J4LcXDoNxj37Mjvg464qS0uFu7OC5QEJNGsig9QCM0l4
ypZzs/KCNieccY9azvC0VzFoFl9puPO3QoyDYBsUjhc98DAz7ULqBsUUUUAIQGGCAfrS0UUAFFFF
ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA
FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU
UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAQXVpb3sJhuoI54iQSkihhkex
qZVCqFUAKBgAdBS0UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ
AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB
RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF
FFABRRRQB//ZCmVuZHN0cmVhbQplbmRvYmoKMjA3IDAgb2JqCjw8L1I2NQo2NSAwIFIvUjYyCjYy
IDAgUi9SNjMKNjMgMCBSPj4KZW5kb2JqCjIxMSAwIG9iago8PC9SNjEKNjEgMCBSPj4KZW5kb2Jq
CjIxMiAwIG9iago8PC9SNjIKNjIgMCBSL1I2Mwo2MyAwIFI+PgplbmRvYmoKMjE3IDAgb2JqCjw8
L1I2MQo2MSAwIFI+PgplbmRvYmoKMjE4IDAgb2JqCjw8L1IyMTYKMjE2IDAgUi9SNjIKNjIgMCBS
L1I2Mwo2MyAwIFI+PgplbmRvYmoKMjIyIDAgb2JqCjw8L1I2MQo2MSAwIFI+PgplbmRvYmoKMjIz
IDAgb2JqCjw8L1I2Mgo2MiAwIFIvUjYzCjYzIDAgUj4+CmVuZG9iagoyMjcgMCBvYmoKPDwvUjYx
CjYxIDAgUj4+CmVuZG9iagoyMjggMCBvYmoKPDwvUjY1CjY1IDAgUi9SNjIKNjIgMCBSL1I2Mwo2
MyAwIFI+PgplbmRvYmoKMjMyIDAgb2JqCjw8L1I2MQo2MSAwIFI+PgplbmRvYmoKMjMzIDAgb2Jq
Cjw8L1I2Mgo2MiAwIFIvUjYzCjYzIDAgUj4+CmVuZG9iagoyMzcgMCBvYmoKPDwvUjYxCjYxIDAg
Uj4+CmVuZG9iagoyMzggMCBvYmoKPDwvUjYyCjYyIDAgUi9SNjMKNjMgMCBSPj4KZW5kb2JqCjI0
MiAwIG9iago8PC9SNjEKNjEgMCBSPj4KZW5kb2JqCjI0MyAwIG9iago8PC9SNjIKNjIgMCBSL1I2
Mwo2MyAwIFI+PgplbmRvYmoKMjQ3IDAgb2JqCjw8L1R5cGUvRXh0R1N0YXRlCi9TQSB0cnVlPj5l
bmRvYmoKMjQ4IDAgb2JqCjw8L1R5cGUvRXh0R1N0YXRlCi9TQSBmYWxzZT4+ZW5kb2JqCjI0OSAw
IG9iago8PC9SMjQ4CjI0OCAwIFIvUjI0NwoyNDcgMCBSL1I2MQo2MSAwIFI+PgplbmRvYmoKMjUw
IDAgb2JqCjw8L1I4OQo4OSAwIFIvUjgyCjgyIDAgUi9SNjUKNjUgMCBSL1I2Mgo2MiAwIFIvUjYz
CjYzIDAgUj4+CmVuZG9iagoyNTQgMCBvYmoKPDwvUjYxCjYxIDAgUj4+CmVuZG9iagoyNTUgMCBv
YmoKPDwvUjIxNgoyMTYgMCBSL1I2Mgo2MiAwIFIvUjYzCjYzIDAgUj4+CmVuZG9iagoyNTkgMCBv
YmoKPDwvUjI0OAoyNDggMCBSL1IyNDcKMjQ3IDAgUi9SNjEKNjEgMCBSPj4KZW5kb2JqCjI2MCAw
IG9iago8PC9SODkKODkgMCBSL1I4Mgo4MiAwIFIvUjY1CjY1IDAgUi9SNjIKNjIgMCBSL1I2Mwo2
MyAwIFI+PgplbmRvYmoKMjY0IDAgb2JqCjw8L1I2MQo2MSAwIFI+PgplbmRvYmoKMjY1IDAgb2Jq
Cjw8L1I4Mgo4MiAwIFIvUjY1CjY1IDAgUi9SNjIKNjIgMCBSL1I2Mwo2MyAwIFI+PgplbmRvYmoK
MjY5IDAgb2JqCjw8L1I2MQo2MSAwIFI+PgplbmRvYmoKMjcwIDAgb2JqCjw8L1I4OQo4OSAwIFIv
UjY1CjY1IDAgUi9SNjIKNjIgMCBSL1I2Mwo2MyAwIFI+PgplbmRvYmoKMjc0IDAgb2JqCjw8L1I2
MQo2MSAwIFI+PgplbmRvYmoKMjc1IDAgb2JqCjw8L1I4Mgo4MiAwIFIvUjY1CjY1IDAgUi9SNjIK
NjIgMCBSL1I2Mwo2MyAwIFI+PgplbmRvYmoKMjc5IDAgb2JqCjw8L1I2MQo2MSAwIFI+PgplbmRv
YmoKMjgwIDAgb2JqCjw8L1I4Mgo4MiAwIFIvUjY1CjY1IDAgUi9SNjIKNjIgMCBSL1I2Mwo2MyAw
IFI+PgplbmRvYmoKMjg0IDAgb2JqCjw8L1I2MQo2MSAwIFI+PgplbmRvYmoKMjg1IDAgb2JqCjw8
L1I2Mgo2MiAwIFIvUjYzCjYzIDAgUj4+CmVuZG9iagoyODkgMCBvYmoKPDwvUjYxCjYxIDAgUj4+
CmVuZG9iagoyOTAgMCBvYmoKPDwvUjYyCjYyIDAgUi9SNjMKNjMgMCBSPj4KZW5kb2JqCjI5NCAw
IG9iago8PC9SNjEKNjEgMCBSPj4KZW5kb2JqCjI5NSAwIG9iago8PC9SNjIKNjIgMCBSL1I2Mwo2
MyAwIFI+PgplbmRvYmoKMjk5IDAgb2JqCjw8L1I2MQo2MSAwIFI+PgplbmRvYmoKMzAwIDAgb2Jq
Cjw8L1I2NQo2NSAwIFIvUjYyCjYyIDAgUi9SNjMKNjMgMCBSPj4KZW5kb2JqCjMwNCAwIG9iago8
PC9SNjEKNjEgMCBSPj4KZW5kb2JqCjMwNSAwIG9iago8PC9SODkKODkgMCBSL1I2NQo2NSAwIFIv
UjYyCjYyIDAgUi9SNjMKNjMgMCBSPj4KZW5kb2JqCjMwOSAwIG9iago8PC9SNjEKNjEgMCBSPj4K
ZW5kb2JqCjMxMCAwIG9iago8PC9SODkKODkgMCBSL1I2NQo2NSAwIFIvUjYyCjYyIDAgUi9SNjMK
NjMgMCBSPj4KZW5kb2JqCjMxNCAwIG9iago8PC9SNjEKNjEgMCBSPj4KZW5kb2JqCjMxNSAwIG9i
ago8PC9SODkKODkgMCBSL1I2NQo2NSAwIFIvUjYyCjYyIDAgUi9SNjMKNjMgMCBSPj4KZW5kb2Jq
CjMxOSAwIG9iago8PC9SNjEKNjEgMCBSPj4KZW5kb2JqCjMyMCAwIG9iago8PC9SODkKODkgMCBS
L1I2NQo2NSAwIFIvUjYyCjYyIDAgUi9SNjMKNjMgMCBSPj4KZW5kb2JqCjMyNCAwIG9iago8PC9S
NjEKNjEgMCBSPj4KZW5kb2JqCjMyNSAwIG9iago8PC9SODkKODkgMCBSL1I2NQo2NSAwIFIvUjYy
CjYyIDAgUi9SNjMKNjMgMCBSPj4KZW5kb2JqCjMyOSAwIG9iago8PC9SNjEKNjEgMCBSPj4KZW5k
b2JqCjMzMCAwIG9iago8PC9SODkKODkgMCBSL1I2NQo2NSAwIFIvUjYyCjYyIDAgUi9SNjMKNjMg
MCBSPj4KZW5kb2JqCjMzNCAwIG9iago8PC9SNjEKNjEgMCBSPj4KZW5kb2JqCjMzNSAwIG9iago8
PC9SNjUKNjUgMCBSL1I2Mgo2MiAwIFIvUjYzCjYzIDAgUj4+CmVuZG9iagozNDEgMCBvYmoKPDwv
UjYxCjYxIDAgUj4+CmVuZG9iagozNDIgMCBvYmoKPDwvUjgyCjgyIDAgUi9SMzM5CjMzOSAwIFIv
UjY1CjY1IDAgUi9SNjIKNjIgMCBSL1I2Mwo2MyAwIFI+PgplbmRvYmoKMzQ2IDAgb2JqCjw8L1I2
MQo2MSAwIFI+PgplbmRvYmoKMzQ3IDAgb2JqCjw8L1I4OQo4OSAwIFIvUjIxNgoyMTYgMCBSL1I4
Mgo4MiAwIFIvUjY1CjY1IDAgUi9SNjIKNjIgMCBSL1I2Mwo2MyAwIFI+PgplbmRvYmoKMzUxIDAg
b2JqCjw8L1I2MQo2MSAwIFI+PgplbmRvYmoKMzUyIDAgb2JqCjw8L1IyMTYKMjE2IDAgUi9SODIK
ODIgMCBSL1I2NQo2NSAwIFIvUjYyCjYyIDAgUi9SNjMKNjMgMCBSPj4KZW5kb2JqCjM1NiAwIG9i
ago8PC9SNjEKNjEgMCBSPj4KZW5kb2JqCjM1NyAwIG9iago8PC9SODIKODIgMCBSL1IzMzkKMzM5
IDAgUi9SNjUKNjUgMCBSL1I2Mgo2MiAwIFIvUjYzCjYzIDAgUj4+CmVuZG9iagozNjEgMCBvYmoK
PDwvUjYxCjYxIDAgUj4+CmVuZG9iagozNjIgMCBvYmoKPDwvUjgyCjgyIDAgUi9SMzM5CjMzOSAw
IFIvUjY1CjY1IDAgUi9SNjIKNjIgMCBSL1I2Mwo2MyAwIFI+PgplbmRvYmoKMzY2IDAgb2JqCjw8
L1I2MQo2MSAwIFI+PgplbmRvYmoKMzY3IDAgb2JqCjw8L1I4OQo4OSAwIFIvUjY1CjY1IDAgUi9S
NjIKNjIgMCBSL1I2Mwo2MyAwIFI+PgplbmRvYmoKMzcxIDAgb2JqCjw8L1I2MQo2MSAwIFI+Pgpl
bmRvYmoKMzcyIDAgb2JqCjw8L1I2Mgo2MiAwIFIvUjYzCjYzIDAgUj4+CmVuZG9iagozNzYgMCBv
YmoKPDwvUjYxCjYxIDAgUj4+CmVuZG9iagozNzcgMCBvYmoKPDwvUjYyCjYyIDAgUi9SNjMKNjMg
MCBSPj4KZW5kb2JqCjM4MSAwIG9iago8PC9SNjEKNjEgMCBSPj4KZW5kb2JqCjM4MiAwIG9iago8
PC9SODIKODIgMCBSL1I2NQo2NSAwIFIvUjYyCjYyIDAgUi9SNjMKNjMgMCBSPj4KZW5kb2JqCjM4
NyAwIG9iago8PC9SNjEKNjEgMCBSPj4KZW5kb2JqCjM4OCAwIG9iago8PC9SMzg2CjM4NiAwIFI+
PgplbmRvYmoKMzg2IDAgb2JqCjw8L1N1YnR5cGUvSW1hZ2UKL0NvbG9yU3BhY2UvRGV2aWNlUkdC
Ci9XaWR0aCA3NTIKL0hlaWdodCA0NDQKL0JpdHNQZXJDb21wb25lbnQgOAovRmlsdGVyL0ZsYXRl
RGVjb2RlCi9EZWNvZGVQYXJtczw8L1ByZWRpY3RvciAxNQovQ29sdW1ucyA3NTIKL0NvbG9ycyAz
Pj4vTGVuZ3RoIDE3NjY0Pj5zdHJlYW0KeJzt3XtAlHXe//+LX3hIwUNLW+nu7Xoo3BBDLU+5tyfW
LBTJqMBDoH5VNPGAiLgCmVChoqJQom6KiWCFBphp3ni6O4gmK6aWlGZW2rqRxkFFoJvfXDPDMBzH
3iPNDDwff5Rcc83hejHX5/Pimmtm7MrLyxUAAABbZkehAQAAto5CAwAAbB6FBgAA2DwKDQAAsHkU
GgAAYPMoNAAAwOZZrNDUf792dna/2yO54yo3raz42rVCxb6lY3tH+4bcKOMwywqvXSsuU+zt27dv
b2+0zu8faa2/YsHDMNxOWXFhYaG6bY7t27e0r7y0ntv8rXd3Rx7zndpwAMDts5pCU3xqeqtHNirK
uuP503s72vTor9u0wlPJYx6ZcEi7ZEjs8QOzezd4obl2am3onLkbD1Us9lyXuXL6sK66HyxXaMrO
7k369i/PjOzuKHsY6u0Un187Z6rRpilzYj+ImD2yvebSm5+/0Nptm6JsOpnv7+pY7brSLmLWY75T
Gw4AuH1WU2gK/+XV9tEMRYk9/vPs3u1tevTXblrh+mFtZxzSL4k+ciWk370NWmjKLu8d8aenDtW4
aOo7X6/3VjuNZQpN2cW13p3nZuh/rbKHUV7+n7XD7pt7qPpy15cPnwz/W/nN7KdbP2Z45lRbR9JF
zH7Md2rDAQC3zwoKTZn6+ojmr9mJzR/epp2WAnu1q2v0v83XF6ptlOHHmtet6wZ1V6l1/VqXGz8G
3ToZ0x/x2njKM/Z42uzeNa9Vz+2YvAvj+6q4ys3kia0mbFP/PTX2g5cm9vn5aMqEp+aeUhfM+bpk
dZe76sztNu+unuTry7Ds1NMt3DRtY93JG9N6tKjrjuq6Bd3C8oIsr7YDMtRNy4ya9Jj91ZylnoPX
qNvmefxGWq/y7BdaP7ZNexfTXVvqnk2385hrfTDVHrPmBu/IjdS14QCAO8Wihabw7Nrg0LkbNcP+
kNCXH4x+aaOiKzR//XfUtEXZysOTJ/XePe+5jZqpy9Vz04Y3/Pt10Fzrl9O7lobHrsk4pN6K65CX
5728wP9vLXUbY5jgb34Z6ROa7dh54EPKtpfWnOoxO+foatfS8xteCp6xJkO9nmfo6pWLhnV1VKer
otyKh+Eauim801fpe7KU8a+/7t3d0a7om/UR842vMrSLfepi323fOyqFf47Y+mpvx8LUf8xM+r6w
oLDPxtTwrvbaQlP67dpJk+Zu0z5CzfXGe7+21vvdSYv+ZXg8rnNysla5tiz8OCVh5bLQDHVudp0a
Hf7SbO8OLZXSb/fMmrv+iuPDXsPbvTU5VHMrQ6auW/OPwdnrQydHqw9yzqb417SbbNje0m/Tm3f2
0vxjSPThAyF/0y28mDqv83NrPKdGr1wT0qWFZlYu+ih5nfjuWtz8Msp3Ubbjw889+9Ce8MnbTmmy
n7N641I1Q91FiuPklRs9u7ZUis9GTg3NLnScFLO25PUhz2urh+uQIZr1N4Z73l0j0spbMMrnpOb3
1VK/gaWX9ugOPs155/hr3r1bqq9PJs9Zflhxcpn32mznikIzPjrW6dM312g2z3V80oZl47TPlrq2
WncUrWb+D7S4mRrU3/CYew6duyFs9N113Yjmaea76F+mNlxzI+qGU2gAoCFZrtCUfvuP5p2jdT+4
Ksop/XK10HT75ul26osIVQ05/POBQaX73e7/+6mqV4o+8nNIvypH9ctvZnu1etToFhZ+f2tKTIuH
1lS5Qde0C9mj/+uHqLu6vFTjYaz+LG92z6tBNa7y3jfHh958p53LRPWHOUnxj302eIK6SugHF14d
2Un3GGrc+5BP/70i+n7jLQr9/tfQT4PaPV/11jXLv77x6r1nEto9NrPO4LTWncyf7lp5plFBdkLb
R2do7ijzyoFh9xrWqjxaUV5esCOo3XNm3N20bl/pXtmpSnOP+4Y6nKzyok/Fq4erP/tWmfyXeRWR
Kj1W52V7RNb6W/jjyao3HvrD/73awXCEpvzbef9f54pruXpOHfbk38eOfuJvHbQnzGjS1hWaqjyP
/JzWt12dW92lRUFqbfl/dT10d/92lY/ZNTYvx/9AXTdSnn1bG+4a+/PJ2fdQaACgIVms0BRkr2n7
6FzNP9Yd+WF6vw7nMyIf9FJ7hfYIzTe6KWpIaFr6q57K2eS2D09QLzry89Q/ndq4ae+Fmz0WvDqu
Q/H5yH4PvnRK8Yw9/u6Mv968Wdq8eXOltFS5++4WpSd1t6DpHBkL+v2Y17LtqaUuEzdq/ow/8vPW
fu2LU+f1e07zB/SctLwJF5wem6d9GFem97v3/N7lDz4VqmgLzYizi2q5yuz3bq32/G5H0INGU5zr
y5knw4fp/q1/yans8toRf5p7SBnycuYHi/672uP598939yzPaO2m1ojQpOMR43pf/VfyhEfVM4jH
b/ri9d6H2mkvmpN0cvU41wP/GOYerblkyDtfpHt3vxr5SGfNJo9fd3LrdNfKQvN5QttHZqgvweSn
9a5+Xqzq5ucJZt7dWy+U6DbBM/Sdza96333xwNTO7uqP606+V3GRfl4v/tfEVo9u02Y47f6jHn/2
0NxcdOaFwL91+PadWbX+Fm692nFy1Xz6uXZQKgtNefH5vXPGPrXxVJWNmrrp+Hr/3oZCo3u2NDuf
2u/B507pni13v13XVm/ofajWi8a9eWbjiG8Nj3n2f3cs/+Kfdd3IW89fv50N19xIS3t7XnICgAZl
sULz5eZpD0/WzG0v//B/4ercVXZqYvNHtlUtNLrjEErxqYmtHjGcXvNr3um03Xv+Z//ejfrXdNRC
E16+9LF5+r/wh8Qe3z+13PgWNNt4KvEFtynbNH/ezxnWWVFuHFijnRyHxB6ZeGbAlI2aSvLDSe3D
KD46rNWAQ9o5aejnc2q5yuDVeQc0f23/uvcfI56KPqS7vysHZhsOi1ScQ1OY6NV2coaiP4fmZnaV
LVKUc+/Oe0g9PhB64f9eVQ/sKGUZ0/t4ae5hfNL3Cwr+rM6g+nZyav3ER2ZsUzw35af5O1a92ZqF
5kh+Wr/KQlNWXKy01L6/2fy7e68i0ujj+SFqaSrbO6/PU5o6MjXpeqzztDrm9dkPX6iY8vMDeznU
9VvI2/34nKr5GMJUjN40dPls9qdZRz/Zn7am4le/6Ysbfp3O1PVseer80rq2+oTnZ71qvWjc1l82
dn+x4jHP7u1YT3S/bHB+8TY2fHZv3uUEAA3OYoXm880THpmsmduir5wMUdtAbYWm2jyh+XFC+dtO
utdHXD1fntLn4NyXDukLTfBj8w7pbtk1+khOoL1+ktO+Cbyy0GhPaemsFN7XuXMr5caNezz8//Tu
4+ryiumqZqGpepXr7Z+KCfdsY1eUOm/Qc2t0RwymHs9fbzguYqLQaB+PZrUvt03XHquo6HOKsnfe
I2o/8Nz0/dLiWhrGkHX5B6abKjRK6Ac/vDpSd3vKTwf+cZ979JDx0Rs3hpTsMPfuDIXGMEPrj+UY
zev6rav4Varz+oMXdK8eVik0NX4LK4I7vlg1H0OYmv+eS186NTz10B/GXzkQoiuOZRf3juisnlVT
/7Pl71+G1rXVx5490rfWi0a/+cvWni9UPGbNltbzm/olxfV2NpxCAwC/A2t4yUl9refigeWd3dXX
euqfooYcm+02UzPdxuYfmO2o/LT8kftCtS85pUz409Wbpbo5o9nd9zi11P3Vrp+kNdt4NvEFF3Uq
nfNFyeru9sq/kpen/tCyR8+hI+89oHvJKfqDL4JGdjySGDF4svpakvqS0+dzal7FxXXIcyNdz6cE
PDxhY+XGeK77OW267h3D9RaaypeENJvfTnu/sZkXZg/rVGz0Cs5bAz5p9xsLTXn5f3RRKMqQpCOb
n+vX8drZzKCHn9KeWRJ6oeTV9ifNvTtDofF8+YPt4SNbFp79x6CHo09pX3LyLdFN3i9nXgkfdu9P
R9ffN2CGoj9Q8UNAazdNUtGHrywY1O5s4uRafwvPDi6ZXDUfpSJMzX+vZi37wwD1uTF13eHoKX9T
z1VJi330ueovUNZ8tviXv1XnVj96oNaLRr+Rk+anGB5zyN/aF2S/XteN3OaGa25EUXjJCQAalgVP
Cj43r/mDuvNQhngOOaR711LFFFXlXMvif+nOsdW+iBD60PNqkxg/J1Q5EL1Ne4hkSPSR/Qv6KlVP
Cq5WaJRrR592Gqh9UWrI+PHKNu1rFuOTvnjL13GF259Dq56coejmpM5f1bzKuK1nNvb+V2vtScFD
ojPf6Jn58FPqmc3j1x3fOr23YlRo1nu1nVF3oSkv/Xb5E10W6Tba1VU5pXsE44/nb+12IaGehmF8
s8ZvUy8+m9rv4edqbIdmrv0hfFgHzd2teKJLqBl3Zyg02lsY4nrqkO4m0i7cGN3hh4AWD2n7navn
+D9kVLwepGbY237D8Hb6z+MZvDpvR7/Jtf4Wnr7+Qt2FpupJwcbmfHFjtXO1M3ONni2Brvl1bXWv
lrXn/9kvb/V2LFw/vN1M3UVDYvM+9PxnnTdy7rY2fEjszwc4KRgAGpYl37ZddvmjBU/qPlBEGR8a
3SordOMh9ej9tL9e0H32a7WzIrTvtbkSN+2ZufoiMzX0kSvRazIMZ7EYFxrtn+nqrKMvNIqi+dt6
7pi/G04snbMu87Xpw1qUl9v9+l1iRNhqtR15Rm8auFf71mXtnNT+1ncH53i6G1/l1WnOmgK0RH0n
eejX2a92tS9Mnj5ogvad5e9cOOrdqWXlEZqJbSdrHsGmk1v9XSsKjf7xKBWffrslMlj71miV6/jo
zWuDere3v/nlNm1h0q98NnG6erKR4aQWo5ut9rk7ZZePvrZw2kvbKh6u6/ik+Khxf+ukW8Hu1jeJ
S+eL7+6t5/Vn/hq1mSGbjiTp3kufd2yL+4DJujueE7vp7gPq/byZ84u/q+OJLQGPTtZO+oPf+OXA
9OY1IlV/CzXy0TGcQ1N27WzSilDDg1fve3z0mrUhru0rPym4lmdLD4e6trqu/Hu1u0vz738lBjw2
RfuYh6z7Zf+0NnXfyE9HE/8+cIqJDde2wzYUGgBoSBb/YL2ya9euqV/O49jS+KL6P8Ot8No17Rf6
ONpXvfQ2Pljv12s/XSuzr/h2JfXsk81eE9MfGfbwYz6zxvXroPx0YNh97ocqCo32BsuMr3L7H6xX
8wHU/sF6xYXXbmq25m5DAqIP1qu8R83tFRarj7d9+8pqUBmp9O4MpwFt+uKGf7dSTSSGL1TS33hZ
8bXCm/Z3OzpWfM2S4ZbLNA+pTGnp0K6lvVIzUqXu33jVk4LV73LSbJuiuWLVezH9iX/1bHXViwz3
9WvRL5rHfLdj+xZ3mbqRX2/Vv+GaG6nYcABAQ7Gxb9uWfaVlPdcqL8ga3m7gIe2/jV75Gp9z/S3D
B7vd/h3dPpOx/6a7MHlr9X/C8u3cneHDdcTfMCD+OlJxVvX93m+jmJp57wCA35ONFZo7TrP5l48m
zpw2OaPyY9DGpyWt9XTl+3eqKL/5ufbbQ12Tvvh4XHdzvwMSAIA7i0Kj33zty1iKvfaVA8OlzNMG
4uMrAAD8Dig0zNMAANi8pl5oAABAI0ChAQAANo9CAwAAbB6FBgAA2DwKDQAAsHkUGgAAYPMoNAAA
wOZRaAAAgM2j0AAAAJtHoQEAADaPQgMAAGwehQYAANg8Cg0AALB5FBoAAGDzKDQAAMDm1VJoai6x
s7Or59K61gQAAPh91FNobiQHeiX+PDo1ObBtzUKTd+y1xbEHL+Sp/27ewTvo5WnDOikUGgAAYAl1
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
Jj7ueD1x9sSUS12WJ8W4Kerbmi437zwtdMb9Vz9aFb+riM+hAYA7gYlZhtxQ2ycFF+QsCQipOEPG
yTdq7aS+TpqiEz/p2V2XO0SkJQ5qpVw8sGFRdKp+FQfnoNXLRnbSn3RDoQEAMSZmGXJDnd/lVJD3
4/XSZk4PODUzWl61rNzI+zFfadbayalNlVuk0ACAFBOzDLmBb9sGACvCxCxDbqDQAIAVYWKWITdQ
aADAijAxy5AbKDQAYEWYmGXIDRQaALAiTMwy5AYKDQBYESZmGXIDhQYArAgTswy5gUIDAFaEiVmG
3EChAQArwsQsQ26g0ACAFWFiliE3UGgAwIowMcuQGyg0AGBFmJhlyA0UGgCwIkzMMuQGCg0AWBEm
ZhlyA4UGAKwIE7MMuYFCAwBWhIlZhtxAoQEAK8LELENuoNAAgBVhYpYhN1BoAMCKMDHLkBsoNABg
RZiYZcgNFBoAsCJMzDLkBgoNAFgRJmYZcgOFBgCsCBOzDLmBQgMAVoSJWYbcQKEBACvCxCxDbqDQ
AIAVYWKWITdQaADAijAxy5AbKDQAYEWYmGXIDRQaALAiTMwy5AYKDQBYESZmGXIDhQYArAgTswy5
gUIDAFaEiVmG3EChAQArwsQsQ26g0ACAFWFiliE3UGgANAgmGBlykyE3UGgANAgmGBlykyE3UGgA
NAgmGBlykyE3UGgANAgmGBlykyE3UGgANAgmGBlykyE3UGgANAgmGBlykyE3UGgANAgmGBlykyE3
UGgANAgmGBlykyE3UGgANAgmGBlykyE3UGgANAgmGBlykyE3UGgANAgmGBlykyE3UGgANAgmGBly
kyE3UGgANAgmGBlykyE3UGgANAgmGBlykyE3UGgANAgmGBlykyE3UGgANAgmGBlykyE3UGgANAgm
GBlykyE3UGgANAgmGBlykyE3UGgANAgmGBlykyE3UGgANAgmGBlykyE3UGgANAgmGBlykyE3UGgA
NAgmGBlykyE3UGgANAgmGBlykyE3UGgANAgmGBlykyE3UGgANAgmGBlykyE3UGgANAgmGBlykyE3
UGgANAgmGBlykyE3UGgANAgmGBlykyE3UGgANAgmGBlykyE3UGgANAgmGBlykyE3UGgANAgmGBly
kyE3UGgANAgmGBlykyE3UGgANAgmGBlykyE3UGgANAgmGBlykyE3UGgANAgmGBlykyE3UGgANAgm
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
fJqnW+DkG7V2Ul8nTdGJn/TsrssdItISB7VS8o4lBy9NvKw7I1hxGDFrebBnN/0tUmjQuDBQypCb
DLnJkBvq/C6ngrwfr5c2c3pA/40GuuVVy0ppXl6+5n+tnJxaGS2l0KCRYaCUITcZcpMhN/Bt24AJ
DJQy5CZDbjLkBgoNYAIDpQy5yZCbDLmBQgOYwEApQ24y5CZDbqDQACYwUMqQmwy5yZAbKDSACQyU
MuQmQ24y5AYKDWACA6UMucmQmwy5gUIDmMBAKUNuMuQmQ26g0AAmMFDKkJsMucmQGyg0gAkMlDLk
JkNuMuQGCg1gAgOlDLnJkJsMuYFCA5jAQClDbjLkJkNuoNAAJjBQypCbDLnJkBsoNIAJDJQy5CZD
bjLkBgoNYAIDpQy5yZCbDLmBQtOEsMPLkJsMucmQmwy5gULThLDDy5CbDLnJkJsMuYFC04Sww8uQ
mwy5yZCbDLmBQtOEsMPLkJsMucmQmwy5gULThLDDy5CbDLnJkJsMuYFC04Sww8uQmwy5yZCbDLmB
QtOEsMPLkJsMucmQmwy5gULThLDDy5CbDLnJkJsMuYFC04Sww8uQmwy5yZCbDLmBQtOEsMPLkJsM
ucmQmwy5gULThLDDy5CbDLnJkJsMuYFC04Sww8uQmwy5yZCbDLmBQtOEsMPLkJsMucmQmwy5gULT
hLDDy5CbDLnJkJsMuYFC04Sww8uQmwy5yZCbDLmBQtOEsMPLkJsMucmQmwy5gULThLDDy5CbDLnJ
kJsMuYFC04Sww8uQmwy5yZCbDLmBQtOEsMPLkJsMucmQmwy5gULThLDDy5CbDLnJkJsMuYFC04Sw
w8uQmwy5yZCbDLmBQtOEsMPLkJsMucmQmwy5gULThLDDy5CbDLnJkJsMuYFC04Sww8uQmwy5yZCb
DLmBQtOEsMPLkJsMucmQmwy5wSYLDU9cGXKTITcZcpMhNxlyA4XGAtjhZchNhtxkyE2G3GQoNOaj
0FgAO7wMucmQmwy5yZCbDIXGfBQaC2CHlyE3GXKTITcZcpOh0JiPQmMB7PAy5CZDbjLkJkNuMhQa
81FoLIAdXobcZMhNhtxkyE2GQmM+Co0FsMPLkJsMucmQmwy5yVBozEehsQB2eBlykyE3GXKTITcZ
Co35KDQWwA4vQ24y5CZDbjLkJkOhMR+FxgLY4WXITYbcZMhNhtxkKDTmo9BYADu8DLnJkJsMucmQ
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
TshVlu3OecbZQf8uJ8X/w7NhXe7SFJoZHuGaP+AStCcJ6l/90b7k9P8qC03pubC/jny7f3hOkr73
5OfsWP7uNx5TvE69vqTUc9Us7dHaovN7nn8isN2Cd7f537PhH4tLPFcaL2+vjcuo0NhdyoyqHnvp
ufC/jtxe9Y5WpF7wmBE4oKMlC83tnWyoO/Nambv12KwB91z8YPHw2W+Hp+X49dBdfnVHzKoLHT1m
Pe24uMbbLnIzojyCEp3nprz/4qPf7Q0fHthy/7mwTqbu5UXt35SNY6Cs7aTgKnlWFJplZ5Keqfku
J00Au4J7BaUr/stSw55xM77UhkIwU80jsgEh/gnLEyPTcny1T0L9/mX0QrluH9Q9S203KMvvp+U/
b5nQL+qosiwt+xnDDngrN8rFI1Fxf/f4Ore2jWQ/tU6Nt9CUXQzrPny70j9klf8fvtujnlI6ZtX5
VWPUKbn7E9udfd5cNrXb3dcyNy+O3J6rKJ7vnV7Zo4Vid/2M7iMH+ld0FP2eX319tZhr1r9+Zrum
ExhOB9axwiel7m2cmVFjAxJzDR+6oKhHTed7hacrPnGnI0fqT/519t+6ytc+d49vUKzu3OfL6pGb
ikJTXp67I1jzd4yzT/grkwYpFz5eHBCZqzy/98vA9/46aL16QnHwwD/Zn9yzOSg2ffpbHy8YaKe+
ilR1ecDWT4IH3GdcaJSi09VjLy//amewplFVvSN93bFgoclOMv4rTXtR4Wn18y36V7no1vkMlyeC
1A/LylnpYq/+NaxJNiThleGdlY+1TyGfuP2RgwoD1I+WcQ4Iea6NckspKcjNSkhXX53z350T9lDr
4l3BPYLav3kubLDuXtSV67iX907EGF4psPWBUv+xH/Xk2Vr3klNFbhVKSpTeXi90OR83aIr6cVMB
kZH3Fhbe0l7g2Ge074BONhSCmaqM6mUXo7oPT9T8w3nuJ7v1Z6RpVji5caL38iz3gGWznna7+dX+
JYHLNTP74XOzOtrUs6Uay++n5eVll/Z7DVHfdTFmbqRnn26lP51IDFI/DEn7eVEPKY3lDw/r1HgL
jfo5chkvegVl6Rb1D9idENzdUd3ei4c3zJyyPFe3XPOk075ROXrvCd1Hbx2JnzAx9lrC4XTdx+lq
1v/ufzfWtf71r7ZrnpSGv3t0rPBJqdmKK4fjH58S6+yz6u0oT6O/XfJT5vfR1Jjp//zY88clHuHf
j3HPTdd/wmr42pf9urTWHrnRfqSvQ0UxOrkz3nthgv4G+vu/FR08oGOLou/+d9nMKdv1MSk+4VvD
Xujf0s6u6OLh6KrLw/0GtFDPoQnweP+/T1R8UnDN2O3sSnJ2xBnf0dZlCwZoXz+wWKFRDAfqjC4q
PhveY5TxH7s6urLoPHfr+y/2L/nP8bj5vgn656LiH7l1ge+A5sVnw3qMMv7wX2dn96HPjfH1ebKj
9nSliT283LYeC9Z+iki5buU67uWhOW/tnjVAF8ut8ztcnlhouwOl/oNZ68uzRx2fFKyEvXf80VOR
XhHVT/1skp9DU+n0lvlekenGb73R7l/XD2+JnhKpPy3YeUzIqojJzm3Vvc92g7L8fqpN/vp3xxPX
rolNr7gh7ScF+w7uanwOja3vp9apMRcarVv5V68rdzVv21Z/9r7+orKi/IJfleYt2zq0MF6/zg/W
q7q+4Sq1Pv+s8El5O9/top5Ds/vpM0nPlObn/3pXZTK1f7Ce9mtKdMEap1eUn69+Bmdr9ctLjK9r
vLyWW6vt8Rh/H4rhN2i4I0EI5jDnO2IMK1QLof4vdikvLy24VtiyzT0tbmvlxvMdMXyXk/luP8Oy
W0UF10vuuqt127aN4ePdrGo/1WWr8F1Ov6PGWWjqUf/21lpoftP6Nkr75UoTDC8tGatZaGpet+aa
Sr0jiMncGlPssm2p9Vq2teGADbkj+6nJymLyUpijyRUa1Mr42yLrKTQAAFgnCg1U9TwNKDQAAOtH
oQEAADaPQgMAAGze/w/2A0mGCmVuZHN0cmVhbQplbmRvYmoKMzkyIDAgb2JqCjw8L1I2MQo2MSAw
IFI+PgplbmRvYmoKMzkzIDAgb2JqCjw8L1I2NQo2NSAwIFIvUjYyCjYyIDAgUi9SNjMKNjMgMCBS
Pj4KZW5kb2JqCjM5NyAwIG9iago8PC9SNjEKNjEgMCBSPj4KZW5kb2JqCjM5OCAwIG9iago8PC9S
ODIKODIgMCBSL1I2NQo2NSAwIFIvUjYyCjYyIDAgUi9SNjMKNjMgMCBSPj4KZW5kb2JqCjQwMiAw
IG9iago8PC9SNjEKNjEgMCBSPj4KZW5kb2JqCjQwMyAwIG9iago8PC9SODIKODIgMCBSL1I2NQo2
NSAwIFIvUjYyCjYyIDAgUi9SNjMKNjMgMCBSPj4KZW5kb2JqCjQwNyAwIG9iago8PC9SNjEKNjEg
MCBSPj4KZW5kb2JqCjQwOCAwIG9iago8PC9SODIKODIgMCBSL1I2NQo2NSAwIFIvUjYyCjYyIDAg
Ui9SNjMKNjMgMCBSPj4KZW5kb2JqCjQxMiAwIG9iago8PC9SNjEKNjEgMCBSPj4KZW5kb2JqCjQx
MyAwIG9iago8PC9SODIKODIgMCBSL1I2NQo2NSAwIFIvUjYyCjYyIDAgUi9SNjMKNjMgMCBSPj4K
ZW5kb2JqCjQyMCAwIG9iago8PC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDE3Nj4+c3RyZWFt
CnicXU/LDsIgELzzFfsHUDQxJg2XeulBY9QfoLA0HAqE0oN/Lw/rwcNsMrszmxk6jJfR2QT0Hr16
YgJjnY64+i0qhAln60jHQVuVvqxOtchA6HCV4fUOCFmApvGbXJA+jpzVVddMymtcg1QYpZuR9IyJ
3hhB0Om/06EZJrMrO9HAppPI1IgKzjjPlOdLw5nXb7uvPC4R90SgthjRpdqj5izxrMNf1eBDcUEG
+QAnhVnHCmVuZHN0cmVhbQplbmRvYmoKODkgMCBvYmoKPDwvQmFzZUZvbnQvV1pFRURRK0NNU1kx
MC9Gb250RGVzY3JpcHRvciA5MCAwIFIvVG9Vbmljb2RlIDQyMCAwIFIvVHlwZS9Gb250Ci9GaXJz
dENoYXIgMS9MYXN0Q2hhciAxMDUvV2lkdGhzWyAyNzcgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg
MCA1MDAKMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMAowIDEwMDAgMCAwIDAgMCAwIDAg
MCAwIDAgMCAwIDAgMCAwCjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAKMCAwIDAgMCAw
IDAgMCAwIDAgMCAwIDAgMCAwIDAgMAowIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwCjAg
MCAwIDAgMCAwIDAgMCAzODggMzg4XQovRW5jb2RpbmcgNDIxIDAgUi9TdWJ0eXBlL1R5cGUxPj4K
ZW5kb2JqCjQyMSAwIG9iago8PC9UeXBlL0VuY29kaW5nL0Jhc2VFbmNvZGluZy9XaW5BbnNpRW5j
b2RpbmcvRGlmZmVyZW5jZXNbCjEvcGVyaW9kY2VudGVyZWQKMTUvYnVsbGV0CjMzL2Fycm93cmln
aHQKMTA0L2FuZ2JyYWNrZXRsZWZ0L2FuZ2JyYWNrZXRyaWdodF0+PgplbmRvYmoKMjE2IDAgb2Jq
Cjw8L0Jhc2VGb250L0hlbHZldGljYS1PYmxpcXVlL1R5cGUvRm9udAovU3VidHlwZS9UeXBlMT4+
CmVuZG9iago4MiAwIG9iago8PC9CYXNlRm9udC9OTElOSEwrQ01UVDEyL0ZvbnREZXNjcmlwdG9y
IDgzIDAgUi9UeXBlL0ZvbnQKL0ZpcnN0Q2hhciAzMy9MYXN0Q2hhciAxMjYvV2lkdGhzWyA1MTQg
NTE0IDAgNTE0IDAgMCA1MTQgNTE0IDUxNCA1MTQgNTE0IDUxNCA1MTQgNTE0IDUxNAo1MTQgNTE0
IDUxNCA1MTQgMCA1MTQgNTE0IDAgMCA1MTQgNTE0IDUxNCA1MTQgNTE0IDUxNCA1MTQKMCA1MTQg
NTE0IDAgMCA1MTQgNTE0IDAgMCA1MTQgMCAwIDAgNTE0IDUxNCAwCjUxNCAwIDUxNCAwIDUxNCAw
IDUxNCAwIDAgMCAwIDUxNCAwIDUxNCA1MTQgMAowIDUxNCA1MTQgNTE0IDUxNCA1MTQgNTE0IDUx
NCA1MTQgNTE0IDAgNTE0IDUxNCA1MTQgNTE0IDUxNAo1MTQgMCA1MTQgNTE0IDUxNCA1MTQgMCA1
MTQgNTE0IDUxNCAwIDUxNCAwIDUxNCA1MTRdCi9FbmNvZGluZyA0MjIgMCBSL1N1YnR5cGUvVHlw
ZTE+PgplbmRvYmoKNDIyIDAgb2JqCjw8L1R5cGUvRW5jb2RpbmcvQmFzZUVuY29kaW5nL1dpbkFu
c2lFbmNvZGluZy9EaWZmZXJlbmNlc1sKMzkvcXVvdGVyaWdodF0+PgplbmRvYmoKMzM5IDAgb2Jq
Cjw8L0Jhc2VGb250L05BTVhWTCtDTVNMVFQxMC9Gb250RGVzY3JpcHRvciAzNDAgMCBSL1R5cGUv
Rm9udAovRmlyc3RDaGFyIDQ1L0xhc3RDaGFyIDEyMS9XaWR0aHNbIDUyNSAwIDUyNQowIDAgMCAw
IDAgMCAwIDAgMCAwIDUyNSAwIDAgMCAwIDAKMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg
MAo1MjUgMCAwIDUyNSAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMAowIDUyNSA1MjUgNTI1IDUyNSA1
MjUgMCA1MjUgNTI1IDUyNSAwIDAgNTI1IDUyNSA1MjUgNTI1CjUyNSAwIDUyNSA1MjUgNTI1IDUy
NSAwIDAgMCA1MjVdCi9FbmNvZGluZy9XaW5BbnNpRW5jb2RpbmcvU3VidHlwZS9UeXBlMT4+CmVu
ZG9iago2NSAwIG9iago8PC9CYXNlRm9udC9IZWx2ZXRpY2EtQm9sZC9UeXBlL0ZvbnQKL1N1YnR5
cGUvVHlwZTE+PgplbmRvYmoKNjIgMCBvYmoKPDwvQmFzZUZvbnQvSGVsdmV0aWNhL1R5cGUvRm9u
dAovRW5jb2RpbmcgNDIzIDAgUi9TdWJ0eXBlL1R5cGUxPj4KZW5kb2JqCjQyMyAwIG9iago8PC9U
eXBlL0VuY29kaW5nL0RpZmZlcmVuY2VzWwoyL2ZpL2ZsCjE0Ny9xdW90ZWRibGxlZnQvcXVvdGVk
YmxyaWdodAoxNTAvZW5kYXNoXT4+CmVuZG9iagoxNTUgMCBvYmoKPDwvQmFzZUZvbnQvU1BVVlJI
K0NNUjgvRm9udERlc2NyaXB0b3IgMTU2IDAgUi9UeXBlL0ZvbnQKL0ZpcnN0Q2hhciA0OS9MYXN0
Q2hhciA1MC9XaWR0aHNbIDUzMSA1MzFdCi9FbmNvZGluZy9XaW5BbnNpRW5jb2RpbmcvU3VidHlw
ZS9UeXBlMT4+CmVuZG9iago2MyAwIG9iago8PC9CYXNlRm9udC9LSFdOT0srQ01TWTYvRm9udERl
c2NyaXB0b3IgNjQgMCBSL1R5cGUvRm9udAovRmlyc3RDaGFyIDEzL0xhc3RDaGFyIDEzL1dpZHRo
c1sgMTIyMl0KL0VuY29kaW5nIDQyNCAwIFIvU3VidHlwZS9UeXBlMT4+CmVuZG9iago0MjQgMCBv
YmoKPDwvVHlwZS9FbmNvZGluZy9CYXNlRW5jb2RpbmcvV2luQW5zaUVuY29kaW5nL0RpZmZlcmVu
Y2VzWwoxMy9jaXJjbGVjb3B5cnRdPj4KZW5kb2JqCjEzOCAwIG9iago8PC9CYXNlRm9udC9XWFhC
UVQrQ01SMTAvRm9udERlc2NyaXB0b3IgMTM5IDAgUi9UeXBlL0ZvbnQKL0ZpcnN0Q2hhciA0OS9M
YXN0Q2hhciA1MS9XaWR0aHNbIDUwMCA1MDAgNTAwXQovRW5jb2RpbmcvV2luQW5zaUVuY29kaW5n
L1N1YnR5cGUvVHlwZTE+PgplbmRvYmoKOTAgMCBvYmoKPDwvVHlwZS9Gb250RGVzY3JpcHRvci9G
b250TmFtZS9XWkVFRFErQ01TWTEwL0ZvbnRCQm94WzAgLTI1MCA5NDMgNzUwXS9GbGFncyA0Ci9B
c2NlbnQgNzUwCi9DYXBIZWlnaHQgNzUwCi9EZXNjZW50IC0yNTAKL0l0YWxpY0FuZ2xlIDAKL1N0
ZW1WIDE0MQovTWlzc2luZ1dpZHRoIDUwMAovQ2hhclNldCgvYW5nYnJhY2tldGxlZnQvYW5nYnJh
Y2tldHJpZ2h0L2Fycm93cmlnaHQvYnVsbGV0L3BlcmlvZGNlbnRlcmVkKS9Gb250RmlsZTMgNDE0
IDAgUj4+CmVuZG9iago0MTQgMCBvYmoKPDwvRmlsdGVyL0ZsYXRlRGVjb2RlCi9TdWJ0eXBlL1R5
cGUxQy9MZW5ndGggNjE0Pj5zdHJlYW0KeJxNj99LU2EYx993v1w2ZwWrxNperUBB/FUQhhQxlAKN
UG+EyI7b0Q3dOeOcY4dZucPRjc3XnS2bZ0UbmiOYdNHFKOjCq0F/QldBJN1GN+l7tmPQmV7UxcPz
fJ/n+3x4HggsJgAhbPCOjk/29dbLK1or1C6YtItmrCs1b1W2YocZOyw72sEZkj1Nks1EPgVsELIL
K0r+nZcNR7jgbEBAHb5O1DcwcL0L9ff2DqDbIZoL+igGjVJCgA5RgiHm0TjrC9JCBHUMBgQhfKOn
RxTFbirEd7Pc7M3OLiQGhQAao3mae0z70TDLCOgeFaLR8X3dx8nLhsILAs2hUdZPcwzFcax4dAPF
zE5zlG+OFubpmf/U0RAAYIXNbYEgABwQ4CrEcA3YjPeBBVwGd8F7aIJjWsJJdsjkPvy+byYTRHGV
+CLD8DzDFPlSqVgsuZ1aorJFfm3CinbOrN03LAf9e+06uNbf3rZ3lYDfP/YO3M7aU7JYhpVao7n6
hSy6Jqjw9PLSw+HlEbxqj+bwi/xaqpB2b//8/I1YP+XSSgqv4/WYklybyutNuzQZTORWlUVsX47i
aDI78uGOZzNUCnycs/95YotEsCgWcMHj1M7rylZtfBMSE+HM5Gv1gSuj4hTO2FU5K8kr8ciKW/ce
TlmTsUQMx3ACJzPRXcclYvTSUmbpFW5Rs1lVwam46tGHNL/1H7JSJ74lz1yZnEFUcN2UM3Z1r/Yo
lo89l3CLJMtSHSl5yNChXx86nI5LOInjLVJWVl+mNzbSbidfrN56Y9Nb1YZyY/mku9FydibqOFF+
7XAY0QTAX63RELMKZW5kc3RyZWFtCmVuZG9iago4MyAwIG9iago8PC9UeXBlL0ZvbnREZXNjcmlw
dG9yL0ZvbnROYW1lL05MSU5ITCtDTVRUMTIvRm9udEJCb3hbLTEgLTIyOSA1MTQgNjk0XS9GbGFn
cyA3Ci9Bc2NlbnQgNjk0Ci9DYXBIZWlnaHQgNjI1Ci9EZXNjZW50IC0yMjkKL0l0YWxpY0FuZ2xl
IDAKL1N0ZW1WIDExMwovQXZnV2lkdGggNTE0Ci9NYXhXaWR0aCA1MTQKL01pc3NpbmdXaWR0aCA1
MTQKL1hIZWlnaHQgNDQzCi9DaGFyU2V0KC9BL0IvRS9GL0kvTS9OL1AvUi9UL1YvYS9hc2NpaWNp
cmN1bS9hc2NpaXRpbGRlL2FzdGVyaXNrL2IvYnJhY2VsZWZ0L2JyYWNlcmlnaHQvYnJhY2tldGxl
ZnQvYnJhY2tldHJpZ2h0L2MvY29sb24vY29tbWEvZC9kb2xsYXIvZS9lcXVhbC9leGNsYW0vZi9m
aXZlL2cvZ3JlYXRlci9oL2h5cGhlbi9pL2svbC9sZXNzL20vbi9uaW5lL28vb25lL3AvcGFyZW5s
ZWZ0L3BhcmVucmlnaHQvcGVyaW9kL3BsdXMvcXVlc3Rpb24vcXVvdGVkYmwvcXVvdGVyaWdodC9y
L3Mvc2VtaWNvbG9uL3NpeC9zbGFzaC90L3RocmVlL3R3by91L3cveC95L3plcm8pL0ZvbnRGaWxl
MyA0MTUgMCBSPj4KZW5kb2JqCjQxNSAwIG9iago8PC9GaWx0ZXIvRmxhdGVEZWNvZGUKL1N1YnR5
cGUvVHlwZTFDL0xlbmd0aCA1MzI2Pj5zdHJlYW0KeJylVwlUU9fWvjGQXCccbwXru5dWX5Xn0NZZ
S61DrXXAAal1AgVFZgIhQMJMQhiyQ4AkEAhTGIJM4lCHqrVVMWrbKNbq69Nq1ddqrbVW27+e6zr0
9Z0AEvr0rX/9619xLTnrnLuHb+/97b0FlEs/SiAQiBf5+Pm9PtXx5yv8iwJ+TD/+L0INVvAlT5a5
wiAhDHJpGvOieTg/ZhgqH4I2DKWEAoEkPmuRJEYhDQsJlXlO2Obl+fqcObMmeU597bU5nguigqVh
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
0QOfFdM23MJ8mvFRAPjBhqANi9NpZ4P83zz26xzAKDfHyGLTVDkZakju6p1Vdz55fE7SEBYWHxMt
Lwk5kucA4ZSF31zd3f2W8WlMsb6kiFSFRWFKYfM0Kk0eZKg88HW8PT0rK4NwIChKsgzZ6BoOdtfn
GNRGoM2VJotJXZyh5/ARtNLVkWUb7P+0C/bwK8gsgR4xpU2koYaTVRTfF6WEQ3hEM5g49AhPYsyt
0NoSCekcfixKiyKttpWsAg4BdgtaTeZ0q02I6vlqRkv6Hfm9L12/PpLYkUNKLbk8tczy6Dxy+0do
a3Bkiiw+rjKhwUhYruA/nFqBdjImvb4ETFCZoVcV4mso2D2rQFWkBDpFkZ6gKFEXZ3HoIF6BD2Kf
zCyClsIjoTLdzOZrDdp8KDF49PZlNI/QzXxfBkqzClKLMXsvDI2F+3CvBY1DnvfLivUFUEoXZ5fH
SResWebPrn1TMgUmARZ+MOXA6sPLL63cCXRdYUUXY3dVNmUTnL32+ZeoH+GUZpTMQEfbsSsfHrJW
tsFuerfsNmnco/yWrwptVJnM9abG8uzCnEK2rLq15jzQ/7M7NFwiTVFmc/ivM3Nnw3o6BFJ374aK
GtaIvZ9dbZxOtBBt98mIAFfkDxfdDzu84DzpKTJ1kjJdn12ZTqb5GYfxaMCu8Ho0Ho/HTkhTqrIh
jVYWJdXWX7bZD7O269Yf4DvaLd3ELzKit0wirNCLbQPsA9kBLgrJoP62QYPsgwZT1L8BzL6xCQpl
bmRzdHJlYW0KZW5kb2JqCjM0MCAwIG9iago8PC9UeXBlL0ZvbnREZXNjcmlwdG9yL0ZvbnROYW1l
L05BTVhWTCtDTVNMVFQxMC9Gb250QkJveFstMjAgLTIyOSA1NzYgNjk0XS9GbGFncyAzMwovQXNj
ZW50IDY5NAovQ2FwSGVpZ2h0IDYyMgovRGVzY2VudCAtMjI5Ci9JdGFsaWNBbmdsZSAwCi9TdGVt
ViA4NgovQXZnV2lkdGggNTI1Ci9NYXhXaWR0aCA1MjUKL01pc3NpbmdXaWR0aCA1MjUKL1hIZWln
aHQgNDQyCi9DaGFyU2V0KC9QL1MvYS9iL2MvY29sb24vZC9lL2cvaC9oeXBoZW4vaS9sL20vbi9v
L3Avci9zL3NsYXNoL3QvdS95KS9Gb250RmlsZTMgNDE2IDAgUj4+CmVuZG9iago0MTYgMCBvYmoK
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
gDWJj6THs8OBObhf8SP7Nbb+EXL+cA6mY5PoD8XwcNpc9vfyjnvqByH3GHeGblEHFDkqhTLPXxhs
b21tZ/Cs2w4a3zOq8lsjnvwY+S4aGOojbihvHh4VgkREOEOYq+EN9s8fIfNHQq6bu0TbnXY3OChf
mbdIbdJXWhiwgVWnSOveVJvB59D4mQtmbG5RNBeyodyg6TP1h5qpb+oDmSCh1m9ImF+EY+Abn8MF
bqZF7dIataAtZ8xGJZ4HlsFManbWvt7EHM38yPAOb0f0F4j4+kNpV2k9m9umdk5vVbty3CZHjie/
FQ5RvWd7LiGRfYFcA4Wdre66gHOIFU7Hy/Tgf0iE541oxM92RCT8wChaLo/yoCnk3SznUt4XImOY
VubfjeFB+lSgYF0dvJo1wb1nj3Z2AVXntWUabRZ+n1KxRzTW+d0D9R97BtxHoRoaKH5zVyanpRuM
jP5w9m4lKCGrLFdlbiuIpHn2ELC9EGIjX1WFQ54YKXftf7+ex45azgt+4eYIuRzUQnu6oKtLCnoW
XyD1UpBKu8ATObTY/6uqWfA2t1fIffjrZNrldrqhjmrSNKjVFfqyCub2pn+tq9BbTFAeV+wraW6q
8dRVDxLMr9NzKFbA3c9F0/tUbdKsLJlEFsg92Nm573VmC+79/Z+TDLu5hFr01G5DA4mL3ePD0f0T
meioYkXMBIL4N7NFsiwKZW5kc3RyZWFtCmVuZG9iagoxNTYgMCBvYmoKPDwvVHlwZS9Gb250RGVz
Y3JpcHRvci9Gb250TmFtZS9TUFVWUkgrQ01SOC9Gb250QkJveFswIDAgNDc3IDY2NV0vRmxhZ3Mg
NjU1NjgKL0FzY2VudCA2NjUKL0NhcEhlaWdodCA2NjUKL0Rlc2NlbnQgMAovSXRhbGljQW5nbGUg
MAovU3RlbVYgNzEKL01pc3NpbmdXaWR0aCA1MDAKL0NoYXJTZXQoL29uZS90d28pL0ZvbnRGaWxl
MyA0MTcgMCBSPj4KZW5kb2JqCjQxNyAwIG9iago8PC9GaWx0ZXIvRmxhdGVEZWNvZGUKL1N1YnR5
cGUvVHlwZTFDL0xlbmd0aCA0NDE+PnN0cmVhbQp4nGNkYGFiYGRkZHX2DbIAMVR+SDP+kGH6Icvc
3f2j8KcuazcPczcPy9ofikLfowS/h/J/DxRgYGZkzC1scM4vqCzKTM8oUdBI1lQwtLQ011EwMjCw
VHDMTS3KTE7MU/BNLMlIzU0sAXJyFILzkzNTSyoVNGwySkoKrPT1y8vL9RJzi/Xyi9LtNHUUyjNL
MhSCUotTi8pSUxTc8vNKFPwSc1MVQC7TAxHO+bkFpSWpRQq++SmpRXkMDAxMhkYMDEIMwiAHsfgf
/NHB92N595ofq9dsn8/4vf4W8/dzPwVFl3X2FMglJYcV63RzZLEv6z7YfXQZx5+p7Gkd9TpyGVls
W/oedu8AwkfdWzr28iivyWDX6Zi+QR5k1N3v77+8XcN44Mv3klfM39d9TxCdPWvrmtkzTx45dqj7
Gcd3bvUbvwV/89gYGEVtapm5YNWsjfsju+vlVlw5t2RPN8eL3Tbmyk72v7l+88r/FvotVt/Q3dld
JPlDnm3Fd3fWHLaO8ubI+orWZvvu6m6O325sfGULfjjP+p4/dfICtt+J09jXcF3nluNiMZ/Pw7l8
Ag/P9dk8vAwMABCHrGcKZW5kc3RyZWFtCmVuZG9iago2NCAwIG9iago8PC9UeXBlL0ZvbnREZXNj
cmlwdG9yL0ZvbnROYW1lL0tIV05PSytDTVNZNi9Gb250QkJveFswIC0yMTUgMTEyOCA3MTVdL0Zs
YWdzIDQKL0FzY2VudCA3MTUKL0NhcEhlaWdodCA3MTUKL0Rlc2NlbnQgLTIxNQovSXRhbGljQW5n
bGUgMAovU3RlbVYgMTY5Ci9NaXNzaW5nV2lkdGggNTAwCi9DaGFyU2V0KC9jaXJjbGVjb3B5cnQp
L0ZvbnRGaWxlMyA0MTggMCBSPj4KZW5kb2JqCjQxOCAwIG9iago8PC9GaWx0ZXIvRmxhdGVEZWNv
ZGUKL1N1YnR5cGUvVHlwZTFDL0xlbmd0aCAzMjg+PnN0cmVhbQp4nB2OO0/CUBzF74WKiRZ8JEyi
XgcTSAgPBwnGaAyJGw7g4uCjlhta6APbiw2rk5EAo8FootHPQMLUzZHP4Tf4F24HCzk553fOdjAS
QghjHCmVq1eH87bvbWEvEfK2w13enPnT26WuGO6KwhdMNkHZALoG9+tIwNiwn/ols9Wx1LrCSFJO
kXyxWEiTg1yuSM50aqmyZJCyxBSqSywYGqmaskpZhySPFcZaR9ms4zgZSbczplU/SaWJozKFVKhN
rUdaI+emwciFpFOyOJdZZMnUW21GLVI2a9QyZNWSNSrPbzCEEI4i/IJCGAuS9xxLCL+86U4nLv5z
ZwU3PPOhH4cBd6DBR3zM21zjPT4AhzdgBGNogwa9Hf/Nz8f5kN9BBexAcw7hHW74JX8IdB3wYzdm
f09PfyJ873XZXXFX3U9RDBxF6B/nQo6eCmVuZHN0cmVhbQplbmRvYmoKMTM5IDAgb2JqCjw8L1R5
cGUvRm9udERlc2NyaXB0b3IvRm9udE5hbWUvV1hYQlFUK0NNUjEwL0ZvbnRCQm94WzAgLTIyIDQ1
NyA2NjZdL0ZsYWdzIDY1NTY5Ci9Bc2NlbnQgNjY2Ci9DYXBIZWlnaHQgNjY2Ci9EZXNjZW50IC0y
MgovSXRhbGljQW5nbGUgMAovU3RlbVYgNjgKL0F2Z1dpZHRoIDUwMAovTWF4V2lkdGggNTAwCi9N
aXNzaW5nV2lkdGggNTAwCi9DaGFyU2V0KC9vbmUvdGhyZWUvdHdvKS9Gb250RmlsZTMgNDE5IDAg
Uj4+CmVuZG9iago0MTkgMCBvYmoKPDwvRmlsdGVyL0ZsYXRlRGVjb2RlCi9TdWJ0eXBlL1R5cGUx
Qy9MZW5ndGggNjE2Pj5zdHJlYW0KeJwdT19IE3EA/p2bt8vWqk0RyW4HSijJ3CkkU8lsYEitSH2R
irn0cHPebd1uLcFwtiG3/UgoQiMGa6YpB81FphCNsNIICjQIrNiLD6u3VBa/k/OhKR98fN/L9wcD
6gKAYRhutXXQ5n1VKZ/A5PIC+aQK+uUbu6ZCqFVBrfqFvK5HPcdR91HUdQyoMIzz3bN6vEO8q98p
UFW91RRtsTTUUHVms4VqZRne1evgKJtDcDKsQ8ibQarT0+tihCGqqtkpCN7G2tpAIGBysD6Th+8/
W11DBVyCk+pgfAx/m+mj2jycQF12sAx1MM10wFYP6/ULDE/ZPH0MzwEAVHRdPQB6YADFB1eAGlwB
HzFGFnWyCCU5JS3FMeT9rkJvdotLnsH7Amm7WA/dkBjUxOEqfDdD7D3R9IsjNOkexJPjm/BVHpsw
Kaa1FZJbQ4sTKeN+1AbK5bYkfTqH7Fl+utQgI8NGyb8dZEbkp2X4twzh9C9FpxS21tZ1puF4LDm5
MDM04wxFYFQkp74sp1YgkV1stDR1N3fZjEqXMhAMwgj0lRlysgafRecLeXyMDdtHh8OhduiHRL7U
P/sNEahyChVtfZ7Wv0bqM9uo6XfLTqlBAWgR5Uoyz1fW4U8iU//h9KmWKy0DiTtzUjwxl74Oh0np
7dfH85BYeO+nRyJXb9mN7DWXyEdDUV8kDEPRcBSOEoa9YPAhjJFLeCZ1oVopb+PsPediq05jckxK
wJfEvDfO+dx37eY/7QhDumx2m8xXw8ylHxVPCZ0/IVtjiJt4kMCVm5MaqWjtMFmkbohrDyUeabVr
ce0RAP4DGYsBjAplbmRzdHJlYW0KZW5kb2JqCjU3IDAgb2JqCjw8IC9UaXRsZShTdW1tYXJ5KQov
RGVzdC9zbGlkZS41MgovQ291bnQgMSAvUGFyZW50IDYgMCBSCi9QcmV2IDQyIDAgUgovRmlyc3Qg
NTggMCBSIC9MYXN0IDU4IDAgUgo+PgplbmRvYmoKNSAwIG9iago8PC9Eb2MtU3RhcnQgWzQgMCBS
IC9YWVogLTAuMjY5OTg5IDQxLjAzODExNjUgbnVsbF0KL3NsaWRlLjEgWzQgMCBSIC9YWVogLTAu
MjY5OTg5IDEzLjA0MjQ4MDUgbnVsbF0KL3NsaWRlLjIgWzY4IDAgUiAvWFlaIC0wLjI2OTk4OSAx
My4wNDI0ODA1IG51bGxdCi9zbGlkZS4zIFs3MyAwIFIgL1hZWiAtMC4yNjk5ODkgNDEuMDM4MTE2
NSBudWxsXQovc2xpZGUuNCBbNzkgMCBSIC9YWVogLTAuMjY5OTg5IDEzLjA0MjQ4MDUgbnVsbF0K
L3NsaWRlLjUgWzg2IDAgUiAvWFlaIC0wLjI2OTk4OSAxMy4wNDI0ODA1IG51bGxdCi9zbGlkZS42
IFsxMDggMCBSIC9YWVogLTAuMjY5OTg5IDEzLjA0MjQ4MDUgbnVsbF0KL2xzdGxpc3RpbmcuLTEg
WzEwOCAwIFIgL1hZWiAtMC4yNjk5ODkgLTY2LjA1NzAwNjggbnVsbF0KL2xzdG51bWJlci4tMS4x
IFsxMDggMCBSIC9YWVogMTkuNzMwNzI4MSAtODkuODYwOTYxOSBudWxsXQovbHN0bnVtYmVyLi0x
LjIgWzEwOCAwIFIgL1hZWiAxOS43MzA3MjgxIC0xMjMuODU0OTE5IG51bGxdCi9sc3RudW1iZXIu
LTEuMyBbMTA4IDAgUiAvWFlaIDE5LjczMDcyODEgLTE1Ny44NTc5MSBudWxsXQovbHN0bnVtYmVy
Li0xLjQgWzEwOCAwIFIgL1hZWiAxOS43MzA3MjgxIC0xOTEuODYxMDIzIG51bGxdCi9sc3RudW1i
ZXIuLTEuNSBbMTA4IDAgUiAvWFlaIDE5LjczMDcyODEgLTIyNS44NTQ5OCBudWxsXQovbHN0bnVt
YmVyLi0xLjYgWzEwOCAwIFIgL1hZWiAxOS43MzA3MjgxIC0yNTkuODU3OTcxIG51bGxdCi9zbGlk
ZS43IFsxMTMgMCBSIC9YWVogLTAuMjY5OTg5IDEzLjA0MjQ4MDUgbnVsbF0KL2xzdGxpc3Rpbmcu
LTIgWzExMyAwIFIgL1hZWiAtMC4yNjk5ODkgMS4wMzY2ODIxMyBudWxsXQovbHN0bnVtYmVyLi0y
LjEgWzExMyAwIFIgL1hZWiAxOS43MzA3MjgxIC0yMi43NTgyMzk3IG51bGxdCi9sc3RudW1iZXIu
LTIuMiBbMTEzIDAgUiAvWFlaIDE5LjczMDcyODEgLTU2Ljc2MTIzMDUgbnVsbF0KL2xzdG51bWJl
ci4tMi4zIFsxMTMgMCBSIC9YWVogMTkuNzMwNzI4MSAtOTAuNzY0MjgyMiBudWxsXQovbHN0bnVt
YmVyLi0yLjQgWzExMyAwIFIgL1hZWiAxOS43MzA3MjgxIC0xMjQuNzU4MzAxIG51bGxdCi9sc3Ru
dW1iZXIuLTIuNSBbMTEzIDAgUiAvWFlaIDE5LjczMDcyODEgLTE1OC43NjEyOTIgbnVsbF0KL2xz
dG51bWJlci4tMi42IFsxMTMgMCBSIC9YWVogMTkuNzMwNzI4MSAtMTkyLjc2NDQwNCBudWxsXQov
bHN0bnVtYmVyLi0yLjcgWzExMyAwIFIgL1hZWiAxOS43MzA3MjgxIC0yMjYuNzU4MzYyIG51bGxd
Ci9sc3RudW1iZXIuLTIuOCBbMTEzIDAgUiAvWFlaIDE5LjczMDcyODEgLTI2MC43NjEzNTMgbnVs
bF0KL2xzdG51bWJlci4tMi45IFsxMTMgMCBSIC9YWVogMTkuNzMwNzI4MSAtMjk0Ljc2NDQ2NSBu
dWxsXQovbHN0bnVtYmVyLi0yLjEwIFsxMTMgMCBSIC9YWVogMTkuNzMwNzI4MSAtMzI4Ljc1ODM2
MiBudWxsXQovbHN0bnVtYmVyLi0yLjExIFsxMTMgMCBSIC9YWVogMTkuNzMwNzI4MSAtMzYyLjc2
MTQ3NSBudWxsXQovbHN0bnVtYmVyLi0yLjEyIFsxMTMgMCBSIC9YWVogMTkuNzMwNzI4MSAtMzk2
Ljc2NDUyNiBudWxsXQovc2xpZGUuOCBbMTE4IDAgUiAvWFlaIC0wLjI2OTk4OSAxMy4wNDI0ODA1
IG51bGxdCi9sc3RsaXN0aW5nLi0zIFsxMTggMCBSIC9YWVogLTAuMjY5OTg5IC0zMi4wNTM5NTUx
IG51bGxdCi9sc3RudW1iZXIuLTMuMSBbMTE4IDAgUiAvWFlaIDE5LjczMDcyODEgLTU1Ljg1Nzg0
OTEgbnVsbF0KL2xzdG51bWJlci4tMy4yIFsxMTggMCBSIC9YWVogMTkuNzMwNzI4MSAtODkuODYw
OTYxOSBudWxsXQovbHN0bnVtYmVyLi0zLjMgWzExOCAwIFIgL1hZWiAxOS43MzA3MjgxIC0xMjMu
ODU0OTE5IG51bGxdCi9sc3RudW1iZXIuLTMuNCBbMTE4IDAgUiAvWFlaIDE5LjczMDcyODEgLTE1
Ny44NTc5MSBudWxsXQovbHN0bnVtYmVyLi0zLjUgWzExOCAwIFIgL1hZWiAxOS43MzA3MjgxIC0x
OTEuODYxMDIzIG51bGxdCi9sc3RudW1iZXIuLTMuNiBbMTE4IDAgUiAvWFlaIDE5LjczMDcyODEg
LTIyNS44NTQ5OCBudWxsXQovbHN0bnVtYmVyLi0zLjcgWzExOCAwIFIgL1hZWiAxOS43MzA3Mjgx
IC0yNTkuODU3OTcxIG51bGxdCi9sc3RudW1iZXIuLTMuOCBbMTE4IDAgUiAvWFlaIDE5LjczMDcy
ODEgLTI5My44NTIgbnVsbF0KL2xzdG51bWJlci4tMy45IFsxMTggMCBSIC9YWVogMTkuNzMwNzI4
MSAtMzI3Ljg1NDk4IG51bGxdCi9zbGlkZS45IFsxMjMgMCBSIC9YWVogLTAuMjY5OTg5IDEzLjA0
MjQ4MDUgbnVsbF0KL2xzdGxpc3RpbmcuLTQgWzEyMyAwIFIgL1hZWiAtMC4yNjk5ODkgLTY2LjA1
NzAwNjggbnVsbF0KL2xzdG51bWJlci4tNC4xIFsxMjMgMCBSIC9YWVogMTkuNzMwNzI4MSAtODku
ODYwOTYxOSBudWxsXQovbHN0bnVtYmVyLi00LjIgWzEyMyAwIFIgL1hZWiAxOS43MzA3MjgxIC0x
MjMuODU0OTE5IG51bGxdCi9sc3RudW1iZXIuLTQuMyBbMTIzIDAgUiAvWFlaIDE5LjczMDcyODEg
LTE1Ny44NTc5MSBudWxsXQovbHN0bnVtYmVyLi00LjQgWzEyMyAwIFIgL1hZWiAxOS43MzA3Mjgx
IC0xOTEuODYxMDIzIG51bGxdCi9sc3RudW1iZXIuLTQuNSBbMTIzIDAgUiAvWFlaIDE5LjczMDcy
ODEgLTIyNS44NTQ5OCBudWxsXQovbHN0bnVtYmVyLi00LjYgWzEyMyAwIFIgL1hZWiAxOS43MzA3
MjgxIC0yNTkuODU3OTcxIG51bGxdCi9zbGlkZS4xMCBbMTI4IDAgUiAvWFlaIC0wLjI2OTk4OSA0
MS4wMzgxMTY1IG51bGxdCi9zbGlkZS4xMSBbMTM1IDAgUiAvWFlaIC0wLjI2OTk4OSAxMy4wNDI0
ODA1IG51bGxdCi9sc3RsaXN0aW5nLi01IFsxMzUgMCBSIC9YWVogLTAuMjY5OTg5IDEuMDM2Njgy
MTMgbnVsbF0KL2xzdG51bWJlci4tNS4xIFsxMzUgMCBSIC9YWVogMTkuNzMwNzI4MSAtMjIuNzU4
MjM5NyBudWxsXQovbHN0bnVtYmVyLi01LjIgWzEzNSAwIFIgL1hZWiAxOS43MzA3MjgxIC01Ni43
NjEyMzA1IG51bGxdCi9sc3RudW1iZXIuLTUuMyBbMTM1IDAgUiAvWFlaIDE5LjczMDcyODEgLTkw
Ljc2NDI4MjIgbnVsbF0KL2xzdG51bWJlci4tNS40IFsxMzUgMCBSIC9YWVogMTkuNzMwNzI4MSAt
MTI0Ljc1ODMwMSBudWxsXQovbHN0bnVtYmVyLi01LjUgWzEzNSAwIFIgL1hZWiAxOS43MzA3Mjgx
IC0xNTguNzYxMjkyIG51bGxdCi9sc3RudW1iZXIuLTUuNiBbMTM1IDAgUiAvWFlaIDE5LjczMDcy
ODEgLTE5Mi43NjQ0MDQgbnVsbF0KL2xzdG51bWJlci4tNS43IFsxMzUgMCBSIC9YWVogMTkuNzMw
NzI4MSAtMjI2Ljc1ODM2MiBudWxsXQovbHN0bnVtYmVyLi01LjggWzEzNSAwIFIgL1hZWiAxOS43
MzA3MjgxIC0yNjAuNzYxMzUzIG51bGxdCi9sc3RudW1iZXIuLTUuOSBbMTM1IDAgUiAvWFlaIDE5
LjczMDcyODEgLTI5NC43NjQ0NjUgbnVsbF0KL2xzdG51bWJlci4tNS4xMCBbMTM1IDAgUiAvWFla
IDE5LjczMDcyODEgLTMyOC43NTgzNjIgbnVsbF0KL2xzdG51bWJlci4tNS4xMSBbMTM1IDAgUiAv
WFlaIDE5LjczMDcyODEgLTM2Mi43NjE0NzUgbnVsbF0KL2xzdG51bWJlci4tNS4xMiBbMTM1IDAg
UiAvWFlaIDE5LjczMDcyODEgLTM5Ni43NjQ1MjYgbnVsbF0KL3NsaWRlLjEyIFsxNDIgMCBSIC9Y
WVogLTAuMjY5OTg5IDEzLjA0MjQ4MDUgbnVsbF0KL2xzdGxpc3RpbmcuLTYgWzE0MiAwIFIgL1hZ
WiAtMC4yNjk5ODkgMS4wMzY2ODIxMyBudWxsXQovbHN0bnVtYmVyLi02LjEgWzE0MiAwIFIgL1hZ
WiAxOS43MzA3MjgxIC0yMi43NTgyMzk3IG51bGxdCi9sc3RudW1iZXIuLTYuMiBbMTQyIDAgUiAv
WFlaIDE5LjczMDcyODEgLTU2Ljc2MTIzMDUgbnVsbF0KL2xzdG51bWJlci4tNi4zIFsxNDIgMCBS
IC9YWVogMTkuNzMwNzI4MSAtOTAuNzY0MjgyMiBudWxsXQovbHN0bnVtYmVyLi02LjQgWzE0MiAw
IFIgL1hZWiAxOS43MzA3MjgxIC0xMjQuNzU4MzAxIG51bGxdCi9sc3RudW1iZXIuLTYuNSBbMTQy
IDAgUiAvWFlaIDE5LjczMDcyODEgLTE1OC43NjEyOTIgbnVsbF0KL2xzdG51bWJlci4tNi42IFsx
NDIgMCBSIC9YWVogMTkuNzMwNzI4MSAtMTkyLjc2NDQwNCBudWxsXQovbHN0bnVtYmVyLi02Ljcg
WzE0MiAwIFIgL1hZWiAxOS43MzA3MjgxIC0yMjYuNzU4MzYyIG51bGxdCi9sc3RudW1iZXIuLTYu
OCBbMTQyIDAgUiAvWFlaIDE5LjczMDcyODEgLTI2MC43NjEzNTMgbnVsbF0KL2xzdG51bWJlci4t
Ni45IFsxNDIgMCBSIC9YWVogMTkuNzMwNzI4MSAtMjk0Ljc2NDQ2NSBudWxsXQovc2xpZGUuMTMg
WzE0NyAwIFIgL1hZWiAtMC4yNjk5ODkgMTMuMDQyNDgwNSBudWxsXQovbHN0bGlzdGluZy4tNyBb
MTQ3IDAgUiAvWFlaIC0wLjI2OTk4OSAxLjAzNjY4MjEzIG51bGxdCi9sc3RudW1iZXIuLTcuMSBb
MTQ3IDAgUiAvWFlaIDE5LjczMDcyODEgLTIyLjc1ODIzOTcgbnVsbF0KL2xzdG51bWJlci4tNy4y
IFsxNDcgMCBSIC9YWVogMTkuNzMwNzI4MSAtNTYuNzYxMjMwNSBudWxsXQovbHN0bnVtYmVyLi03
LjMgWzE0NyAwIFIgL1hZWiAxOS43MzA3MjgxIC05MC43NjQyODIyIG51bGxdCi9sc3RudW1iZXIu
LTcuNCBbMTQ3IDAgUiAvWFlaIDE5LjczMDcyODEgLTEyNC43NTgzMDEgbnVsbF0KL2xzdG51bWJl
ci4tNy41IFsxNDcgMCBSIC9YWVogMTkuNzMwNzI4MSAtMTU4Ljc2MTI5MiBudWxsXQovbHN0bnVt
YmVyLi03LjYgWzE0NyAwIFIgL1hZWiAxOS43MzA3MjgxIC0xOTIuNzY0NDA0IG51bGxdCi9sc3Ru
dW1iZXIuLTcuNyBbMTQ3IDAgUiAvWFlaIDE5LjczMDcyODEgLTIyNi43NTgzNjIgbnVsbF0KL2xz
dG51bWJlci4tNy44IFsxNDcgMCBSIC9YWVogMTkuNzMwNzI4MSAtMjYwLjc2MTM1MyBudWxsXQov
bHN0bnVtYmVyLi03LjkgWzE0NyAwIFIgL1hZWiAxOS43MzA3MjgxIC0yOTQuNzY0NDY1IG51bGxd
Ci9sc3RudW1iZXIuLTcuMTAgWzE0NyAwIFIgL1hZWiAxOS43MzA3MjgxIC0zMjguNzU4MzYyIG51
bGxdCi9sc3RudW1iZXIuLTcuMTEgWzE0NyAwIFIgL1hZWiAxOS43MzA3MjgxIC0zNjIuNzYxNDc1
IG51bGxdCi9sc3RudW1iZXIuLTcuMTIgWzE0NyAwIFIgL1hZWiAxOS43MzA3MjgxIC0zOTYuNzY0
NTI2IG51bGxdCi9sc3RudW1iZXIuLTcuMTMgWzE0NyAwIFIgL1hZWiAxOS43MzA3MjgxIC00MzAu
NzU4NDg0IG51bGxdCi9zbGlkZS4xNCBbMTUyIDAgUiAvWFlaIC0wLjI2OTk4OSAxMy4wNDI0ODA1
IG51bGxdCi9sc3RsaXN0aW5nLi04IFsxNTIgMCBSIC9YWVogLTAuMjY5OTg5IC0xLjk2MzMxNzg3
IG51bGxdCi9sc3RudW1iZXIuLTguMSBbMTUyIDAgUiAvWFlaIDE5LjczMDcyODEgLTIxLjU1NzU1
NjIgbnVsbF0KL2xzdG51bWJlci4tOC4yIFsxNTIgMCBSIC9YWVogMTkuNzMwNzI4MSAtNDkuNTYy
MTMzOCBudWxsXQovbHN0bnVtYmVyLi04LjMgWzE1MiAwIFIgL1hZWiAxOS43MzA3MjgxIC03Ny41
NTc3MzkzIG51bGxdCi9sc3RudW1iZXIuLTguNCBbMTUyIDAgUiAvWFlaIDE5LjczMDcyODEgLTEw
NS41NjIzNzggbnVsbF0KL2xzdG51bWJlci4tOC41IFsxNTIgMCBSIC9YWVogMTkuNzMwNzI4MSAt
MTMzLjU1NzkyMiBudWxsXQovbHN0bnVtYmVyLi04LjYgWzE1MiAwIFIgL1hZWiAxOS43MzA3Mjgx
IC0xNjEuNTYyNTYxIG51bGxdCi9sc3RudW1iZXIuLTguNyBbMTUyIDAgUiAvWFlaIDE5LjczMDcy
ODEgLTE4OS41NTgxNjcgbnVsbF0KL2xzdG51bWJlci4tOC44IFsxNTIgMCBSIC9YWVogMTkuNzMw
NzI4MSAtMjE3LjU2MjgwNSBudWxsXQovbHN0bnVtYmVyLi04LjkgWzE1MiAwIFIgL1hZWiAxOS43
MzA3MjgxIC0yNDUuNTU4MzUgbnVsbF0KL2xzdG51bWJlci4tOC4xMCBbMTUyIDAgUiAvWFlaIDE5
LjczMDcyODEgLTI3My41NjMgbnVsbF0KL2xzdG51bWJlci4tOC4xMSBbMTUyIDAgUiAvWFlaIDE5
LjczMDcyODEgLTMwMS41NTg3MTYgbnVsbF0KL2xzdG51bWJlci4tOC4xMiBbMTUyIDAgUiAvWFla
IDE5LjczMDcyODEgLTMyOS41NjMyOTMgbnVsbF0KL2xzdG51bWJlci4tOC4xMyBbMTUyIDAgUiAv
WFlaIDE5LjczMDcyODEgLTM1Ny41NTg4MzggbnVsbF0KL2xzdG51bWJlci4tOC4xNCBbMTUyIDAg
UiAvWFlaIDE5LjczMDcyODEgLTM4NS41NjM0MTYgbnVsbF0KL2xzdG51bWJlci4tOC4xNSBbMTUy
IDAgUiAvWFlaIDE5LjczMDcyODEgLTQxMy41NTkwMjEgbnVsbF0KL2xzdG51bWJlci4tOC4xNiBb
MTUyIDAgUiAvWFlaIDE5LjczMDcyODEgLTQ0MS41NjM1OTkgbnVsbF0KL2xzdG51bWJlci4tOC4x
NyBbMTUyIDAgUiAvWFlaIDE5LjczMDcyODEgLTQ2OS41NTkyNjUgbnVsbF0KL3NsaWRlLjE1IFsx
NTkgMCBSIC9YWVogLTAuMjY5OTg5IDEzLjA0MjQ4MDUgbnVsbF0KL2xzdGxpc3RpbmcuLTkgWzE1
OSAwIFIgL1hZWiAtMC4yNjk5ODkgMS4wMzY2ODIxMyBudWxsXQovbHN0bnVtYmVyLi05LjEgWzE1
OSAwIFIgL1hZWiAxOS43MzA3MjgxIC0yMi43NTgyMzk3IG51bGxdCi9sc3RudW1iZXIuLTkuMiBb
MTU5IDAgUiAvWFlaIDE5LjczMDcyODEgLTU2Ljc2MTIzMDUgbnVsbF0KL2xzdG51bWJlci4tOS4z
IFsxNTkgMCBSIC9YWVogMTkuNzMwNzI4MSAtOTAuNzY0MjgyMiBudWxsXQovbHN0bnVtYmVyLi05
LjQgWzE1OSAwIFIgL1hZWiAxOS43MzA3MjgxIC0xMjQuNzU4MzAxIG51bGxdCi9sc3RudW1iZXIu
LTkuNSBbMTU5IDAgUiAvWFlaIDE5LjczMDcyODEgLTE1OC43NjEyOTIgbnVsbF0KL2xzdG51bWJl
ci4tOS42IFsxNTkgMCBSIC9YWVogMTkuNzMwNzI4MSAtMTkyLjc2NDQwNCBudWxsXQovbHN0bnVt
YmVyLi05LjcgWzE1OSAwIFIgL1hZWiAxOS43MzA3MjgxIC0yMjYuNzU4MzYyIG51bGxdCi9sc3Ru
dW1iZXIuLTkuOCBbMTU5IDAgUiAvWFlaIDE5LjczMDcyODEgLTI2MC43NjEzNTMgbnVsbF0KL2xz
dG51bWJlci4tOS45IFsxNTkgMCBSIC9YWVogMTkuNzMwNzI4MSAtMjk0Ljc2NDQ2NSBudWxsXQov
bHN0bnVtYmVyLi05LjEwIFsxNTkgMCBSIC9YWVogMTkuNzMwNzI4MSAtMzI4Ljc1ODM2MiBudWxs
XQovbHN0bnVtYmVyLi05LjExIFsxNTkgMCBSIC9YWVogMTkuNzMwNzI4MSAtMzYyLjc2MTQ3NSBu
dWxsXQovbHN0bnVtYmVyLi05LjEyIFsxNTkgMCBSIC9YWVogMTkuNzMwNzI4MSAtMzk2Ljc2NDUy
NiBudWxsXQovc2xpZGUuMTYgWzE2NCAwIFIgL1hZWiAtMC4yNjk5ODkgMTMuMDQyNDgwNSBudWxs
XQovc2xpZGUuMTcgWzE2OSAwIFIgL1hZWiAtMC4yNjk5ODkgNDEuMDM4MTE2NSBudWxsXQovc2xp
ZGUuMTggWzE3NSAwIFIgL1hZWiAtMC4yNjk5ODkgMTMuMDQyNDgwNSBudWxsXQovc2xpZGUuMTkg
WzE4MCAwIFIgL1hZWiAtMC4yNjk5ODkgMTMuMDQyNDgwNSBudWxsXQovc2xpZGUuMjAgWzE4NSAw
IFIgL1hZWiAtMC4yNjk5ODkgMTMuMDQyNDgwNSBudWxsXQovbHN0bGlzdGluZy4tMTAgWzE4NSAw
IFIgL1hZWiAtMC4yNjk5ODkgLTEwMC4wNiBudWxsXQovbHN0bnVtYmVyLi0xMC4xIFsxODUgMCBS
IC9YWVogMTkuNzMwNzI4MSAtMTIzLjg1NDkxOSBudWxsXQovbHN0bnVtYmVyLi0xMC4yIFsxODUg
MCBSIC9YWVogMTkuNzMwNzI4MSAtMTU3Ljg1NzkxIG51bGxdCi9sc3RudW1iZXIuLTEwLjMgWzE4
NSAwIFIgL1hZWiAxOS43MzA3MjgxIC0xOTEuODYxMDIzIG51bGxdCi9zbGlkZS4yMSBbMTkwIDAg
UiAvWFlaIC0wLjI2OTk4OSAxMy4wNDI0ODA1IG51bGxdCi9sc3RsaXN0aW5nLi0xMSBbMTkwIDAg
UiAvWFlaIC0wLjI2OTk4OSAtNjYuMDU3MDA2OCBudWxsXQovbHN0bnVtYmVyLi0xMS4xIFsxOTAg
MCBSIC9YWVogMTkuNzMwNzI4MSAtODkuODYwOTYxOSBudWxsXQovbHN0bnVtYmVyLi0xMS4yIFsx
OTAgMCBSIC9YWVogMTkuNzMwNzI4MSAtMTIzLjg1NDkxOSBudWxsXQovbHN0bnVtYmVyLi0xMS4z
IFsxOTAgMCBSIC9YWVogMTkuNzMwNzI4MSAtMTU3Ljg1NzkxIG51bGxdCi9sc3RudW1iZXIuLTEx
LjQgWzE5MCAwIFIgL1hZWiAxOS43MzA3MjgxIC0xOTEuODYxMDIzIG51bGxdCi9sc3RudW1iZXIu
LTExLjUgWzE5MCAwIFIgL1hZWiAxOS43MzA3MjgxIC0yMjUuODU0OTggbnVsbF0KL2xzdG51bWJl
ci4tMTEuNiBbMTkwIDAgUiAvWFlaIDE5LjczMDcyODEgLTI1OS44NTc5NzEgbnVsbF0KL3NsaWRl
LjIyIFsxOTUgMCBSIC9YWVogLTAuMjY5OTg5IDEzLjA0MjQ4MDUgbnVsbF0KL2xzdGxpc3Rpbmcu
LTEyIFsxOTUgMCBSIC9YWVogLTAuMjY5OTg5IC0yMC43MjU2NDcgbnVsbF0KL2xzdG51bWJlci4t
MTIuMSBbMTk1IDAgUiAvWFlaIDE5LjczMDcyODEgLTQ0LjUyMDU2ODggbnVsbF0KL2xzdG51bWJl
ci4tMTIuMiBbMTk1IDAgUiAvWFlaIDE5LjczMDcyODEgLTc4LjUyMzU1OTYgbnVsbF0KL2xzdG51
bWJlci4tMTIuMyBbMTk1IDAgUiAvWFlaIDE5LjczMDcyODEgLTExMi41MjY2MTEgbnVsbF0KL2xz
dG51bWJlci4tMTIuNCBbMTk1IDAgUiAvWFlaIDE5LjczMDcyODEgLTE0Ni41MjA2MyBudWxsXQov
bHN0bnVtYmVyLi0xMi41IFsxOTUgMCBSIC9YWVogMTkuNzMwNzI4MSAtMTgwLjUyMzYyMSBudWxs
XQovbHN0bnVtYmVyLi0xMi42IFsxOTUgMCBSIC9YWVogMTkuNzMwNzI4MSAtMjE0LjUyNjY3MiBu
dWxsXQovbHN0bnVtYmVyLi0xMi43IFsxOTUgMCBSIC9YWVogMTkuNzMwNzI4MSAtMjQ4LjUyMDY5
MSBudWxsXQovbHN0bnVtYmVyLi0xMi44IFsxOTUgMCBSIC9YWVogMTkuNzMwNzI4MSAtMjgyLjUy
MzY4MiBudWxsXQovbHN0bnVtYmVyLi0xMi45IFsxOTUgMCBSIC9YWVogMTkuNzMwNzI4MSAtMzE2
LjUyNjczMyBudWxsXQovbHN0bnVtYmVyLi0xMi4xMCBbMTk1IDAgUiAvWFlaIDE5LjczMDcyODEg
LTM1MC41MjA3NTIgbnVsbF0KL3NsaWRlLjIzIFsyMDAgMCBSIC9YWVogLTAuMjY5OTg5IDEzLjA0
MjQ4MDUgbnVsbF0KL3NsaWRlLjI0IFsyMDggMCBSIC9YWVogLTAuMjY5OTg5IDEzLjA0MjQ4MDUg
bnVsbF0KL3NsaWRlLjI1IFsyMTMgMCBSIC9YWVogLTAuMjY5OTg5IDEzLjA0MjQ4MDUgbnVsbF0K
L3NsaWRlLjI2IFsyMTkgMCBSIC9YWVogLTAuMjY5OTg5IDEzLjA0MjQ4MDUgbnVsbF0KL3NsaWRl
LjI3IFsyMjQgMCBSIC9YWVogLTAuMjY5OTg5IDEzLjA0MjQ4MDUgbnVsbF0KL3NsaWRlLjI4IFsy
MjkgMCBSIC9YWVogLTAuMjY5OTg5IDEzLjA0MjQ4MDUgbnVsbF0KL3NsaWRlLjI5IFsyMzQgMCBS
IC9YWVogLTAuMjY5OTg5IDEzLjA0MjQ4MDUgbnVsbF0KL3NsaWRlLjMwIFsyMzkgMCBSIC9YWVog
LTAuMjY5OTg5IDEzLjA0MjQ4MDUgbnVsbF0KL3NsaWRlLjMxIFsyNDQgMCBSIC9YWVogLTAuMjY5
OTg5IDEzLjA0MjQ4MDUgbnVsbF0KL3NsaWRlLjMyIFsyNTEgMCBSIC9YWVogLTAuMjY5OTg5IDEz
LjA0MjQ4MDUgbnVsbF0KL3NsaWRlLjMzIFsyNTYgMCBSIC9YWVogLTAuMjY5OTg5IDEzLjA0MjQ4
MDUgbnVsbF0KL2xzdGxpc3RpbmcuLTEzIFsyNTYgMCBSIC9YWVogLTAuMjY5OTg5IC00OC4zNjg4
OTY1IG51bGxdCi9sc3RudW1iZXIuLTEzLjEgWzI1NiAwIFIgL1hZWiAxOS43MzA3MjgxIC03Mi4x
NjM4MTg0IG51bGxdCi9zbGlkZS4zNCBbMjYxIDAgUiAvWFlaIC0wLjI2OTk4OSAxMy4wNDI0ODA1
IG51bGxdCi9sc3RsaXN0aW5nLi0xNCBbMjYxIDAgUiAvWFlaIC0wLjI2OTk4OSAtODIuNjA2ODEx
NSBudWxsXQovbHN0bnVtYmVyLi0xNC4xIFsyNjEgMCBSIC9YWVogMTkuNzMwNzI4MSAtMTA2LjQw
MTY3MiBudWxsXQovbHN0bnVtYmVyLi0xNC4yIFsyNjEgMCBSIC9YWVogMTkuNzMwNzI4MSAtMTQw
LjQwNDcyNCBudWxsXQovbHN0bnVtYmVyLi0xNC4zIFsyNjEgMCBSIC9YWVogMTkuNzMwNzI4MSAt
MTc0LjQwNzc3NiBudWxsXQovbHN0bnVtYmVyLi0xNC40IFsyNjEgMCBSIC9YWVogMTkuNzMwNzI4
MSAtMjA4LjQwMTczMyBudWxsXQovbHN0bnVtYmVyLi0xNC41IFsyNjEgMCBSIC9YWVogMTkuNzMw
NzI4MSAtMjQyLjQwNDc4NSBudWxsXQovbHN0bnVtYmVyLi0xNC42IFsyNjEgMCBSIC9YWVogMTku
NzMwNzI4MSAtMjc2LjQwNzg5OCBudWxsXQovbHN0bnVtYmVyLi0xNC43IFsyNjEgMCBSIC9YWVog
MTkuNzMwNzI4MSAtMzEwLjQwMTg1NSBudWxsXQovc2xpZGUuMzUgWzI2NiAwIFIgL1hZWiAtMC4y
Njk5ODkgMTMuMDQyNDgwNSBudWxsXQovc2xpZGUuMzYgWzI3MSAwIFIgL1hZWiAtMC4yNjk5ODkg
MTMuMDQyNDgwNSBudWxsXQovbHN0bGlzdGluZy4tMTUgWzI3MSAwIFIgL1hZWiAtMC4yNjk5ODkg
LTgyLjYwNjgxMTUgbnVsbF0KL2xzdG51bWJlci4tMTUuMSBbMjcxIDAgUiAvWFlaIDE5LjczMDcy
ODEgLTEwNi40MDE2NzIgbnVsbF0KL2xzdG51bWJlci4tMTUuMiBbMjcxIDAgUiAvWFlaIDE5Ljcz
MDcyODEgLTE0MC40MDQ3MjQgbnVsbF0KL2xzdG51bWJlci4tMTUuMyBbMjcxIDAgUiAvWFlaIDE5
LjczMDcyODEgLTE3NC40MDc3NzYgbnVsbF0KL2xzdG51bWJlci4tMTUuNCBbMjcxIDAgUiAvWFla
IDE5LjczMDcyODEgLTIwOC40MDE3MzMgbnVsbF0KL2xzdG51bWJlci4tMTUuNSBbMjcxIDAgUiAv
WFlaIDE5LjczMDcyODEgLTI0Mi40MDQ3ODUgbnVsbF0KL2xzdG51bWJlci4tMTUuNiBbMjcxIDAg
UiAvWFlaIDE5LjczMDcyODEgLTI3Ni40MDc4OTggbnVsbF0KL2xzdG51bWJlci4tMTUuNyBbMjcx
IDAgUiAvWFlaIDE5LjczMDcyODEgLTMxMC40MDE4NTUgbnVsbF0KL3NsaWRlLjM3IFsyNzYgMCBS
IC9YWVogLTAuMjY5OTg5IDEzLjA0MjQ4MDUgbnVsbF0KL3NsaWRlLjM4IFsyODEgMCBSIC9YWVog
LTAuMjY5OTg5IDEzLjA0MjQ4MDUgbnVsbF0KL3NsaWRlLjM5IFsyOTYgMCBSIC9YWVogLTAuMjY5
OTg5IDEzLjA0MjQ4MDUgbnVsbF0KL3NsaWRlLjQwIFszMDEgMCBSIC9YWVogLTAuMjY5OTg5IDEz
LjA0MjQ4MDUgbnVsbF0KL3NsaWRlLjQxIFszMzEgMCBSIC9YWVogLTAuMjY5OTg5IDEzLjA0MjQ4
MDUgbnVsbF0KL3NsaWRlLjQyIFszMzYgMCBSIC9YWVogLTAuMjY5OTg5IDEzLjA0MjQ4MDUgbnVs
bF0KL2xzdGxpc3RpbmcuLTE2IFszMzYgMCBSIC9YWVogLTAuMjY5OTg5IDEuMDM2NjgyMTMgbnVs
bF0KL2xzdG51bWJlci4tMTYuMSBbMzM2IDAgUiAvWFlaIDE5LjczMDcyODEgLTIyLjc1ODIzOTcg
bnVsbF0KL2xzdG51bWJlci4tMTYuMiBbMzM2IDAgUiAvWFlaIDE5LjczMDcyODEgLTU2Ljc2MTIz
MDUgbnVsbF0KL2xzdG51bWJlci4tMTYuMyBbMzM2IDAgUiAvWFlaIDE5LjczMDcyODEgLTkwLjc2
NDI4MjIgbnVsbF0KL2xzdG51bWJlci4tMTYuNCBbMzM2IDAgUiAvWFlaIDE5LjczMDcyODEgLTEy
NC43NTgzMDEgbnVsbF0KL2xzdG51bWJlci4tMTYuNSBbMzM2IDAgUiAvWFlaIDE5LjczMDcyODEg
LTE1OC43NjEyOTIgbnVsbF0KL2xzdG51bWJlci4tMTYuNiBbMzM2IDAgUiAvWFlaIDE5LjczMDcy
ODEgLTE5Mi43NjQ0MDQgbnVsbF0KL2xzdG51bWJlci4tMTYuNyBbMzM2IDAgUiAvWFlaIDE5Ljcz
MDcyODEgLTIyNi43NTgzNjIgbnVsbF0KL2xzdG51bWJlci4tMTYuOCBbMzM2IDAgUiAvWFlaIDE5
LjczMDcyODEgLTI2MC43NjEzNTMgbnVsbF0KL2xzdG51bWJlci4tMTYuOSBbMzM2IDAgUiAvWFla
IDE5LjczMDcyODEgLTI5NC43NjQ0NjUgbnVsbF0KL2xzdG51bWJlci4tMTYuMTAgWzMzNiAwIFIg
L1hZWiAxOS43MzA3MjgxIC0zMjguNzU4MzYyIG51bGxdCi9sc3RudW1iZXIuLTE2LjExIFszMzYg
MCBSIC9YWVogMTkuNzMwNzI4MSAtMzYyLjc2MTQ3NSBudWxsXQovbHN0bnVtYmVyLi0xNi4xMiBb
MzM2IDAgUiAvWFlaIDE5LjczMDcyODEgLTM5Ni43NjQ1MjYgbnVsbF0KL3NsaWRlLjQzIFszNDMg
MCBSIC9YWVogLTAuMjY5OTg5IDEzLjA0MjQ4MDUgbnVsbF0KL2xzdGxpc3RpbmcuLTE3IFszNDMg
MCBSIC9YWVogLTAuMjY5OTg5IC0xMzkuNDExMDcyIG51bGxdCi9sc3RudW1iZXIuLTE3LjEgWzM0
MyAwIFIgL1hZWiAxOS43MzA3MjgxIC0xNjMuMjA1OTMzIG51bGxdCi9zbGlkZS40NCBbMzQ4IDAg
UiAvWFlaIC0wLjI2OTk4OSAxMy4wNDI0ODA1IG51bGxdCi9sc3RsaXN0aW5nLi0xOCBbMzQ4IDAg
UiAvWFlaIC0wLjI2OTk4OSAtNzUuOTMwODQ3MiBudWxsXQovbHN0bnVtYmVyLi0xOC4xIFszNDgg
MCBSIC9YWVogMTkuNzMwNzI4MSAtOTkuNzI1NzY5IG51bGxdCi9zbGlkZS40NSBbMzUzIDAgUiAv
WFlaIC0wLjI2OTk4OSAxMy4wNDI0ODA1IG51bGxdCi9sc3RsaXN0aW5nLi0xOSBbMzUzIDAgUiAv
WFlaIC0wLjI2OTk4OSAtMTMzLjYwMjI5NSBudWxsXQovbHN0bnVtYmVyLi0xOS4xIFszNTMgMCBS
IC9YWVogMTkuNzMwNzI4MSAtMTU3LjQwNjI1IG51bGxdCi9sc3RudW1iZXIuLTE5LjIgWzM1MyAw
IFIgL1hZWiAxOS43MzA3MjgxIC0xOTEuNDAwMjY5IG51bGxdCi9sc3RudW1iZXIuLTE5LjMgWzM1
MyAwIFIgL1hZWiAxOS43MzA3MjgxIC0yMjUuNDAzMzIgbnVsbF0KL2xzdG51bWJlci4tMTkuNCBb
MzUzIDAgUiAvWFlaIDE5LjczMDcyODEgLTI1OS40MDYzMTEgbnVsbF0KL3NsaWRlLjQ2IFszNTgg
MCBSIC9YWVogLTAuMjY5OTg5IDEzLjA0MjQ4MDUgbnVsbF0KL2xzdGxpc3RpbmcuLTIwIFszNTgg
MCBSIC9YWVogLTAuMjY5OTg5IC0xNTAuNjAzODgyIG51bGxdCi9sc3RudW1iZXIuLTIwLjEgWzM1
OCAwIFIgL1hZWiAxOS43MzA3MjgxIC0xNzQuNDA3Nzc2IG51bGxdCi9sc3RudW1iZXIuLTIwLjIg
WzM1OCAwIFIgL1hZWiAxOS43MzA3MjgxIC0yMDguNDAxNzMzIG51bGxdCi9sc3RudW1iZXIuLTIw
LjMgWzM1OCAwIFIgL1hZWiAxOS43MzA3MjgxIC0yNDIuNDA0Nzg1IG51bGxdCi9zbGlkZS40NyBb
MzYzIDAgUiAvWFlaIC0wLjI2OTk4OSAxMy4wNDI0ODA1IG51bGxdCi9zbGlkZS40OCBbMzY4IDAg
UiAvWFlaIC0wLjI2OTk4OSAxMy4wNDI0ODA1IG51bGxdCi9zbGlkZS40OSBbMzczIDAgUiAvWFla
IC0wLjI2OTk4OSAxMy4wNDI0ODA1IG51bGxdCi9zbGlkZS41MCBbMzc4IDAgUiAvWFlaIC0wLjI2
OTk4OSAxMy4wNDI0ODA1IG51bGxdCi9sc3RsaXN0aW5nLi0yMSBbMzc4IDAgUiAvWFlaIC0wLjI2
OTk4OSAtMTUwLjYwMzg4MiBudWxsXQovbHN0bnVtYmVyLi0yMS4xIFszNzggMCBSIC9YWVogMTku
NzMwNzI4MSAtMTc0LjQwNzc3NiBudWxsXQovbHN0bnVtYmVyLi0yMS4yIFszNzggMCBSIC9YWVog
MTkuNzMwNzI4MSAtMjA4LjQwMTczMyBudWxsXQovbHN0bnVtYmVyLi0yMS4zIFszNzggMCBSIC9Y
WVogMTkuNzMwNzI4MSAtMjQyLjQwNDc4NSBudWxsXQovc2xpZGUuNTEgWzM4MyAwIFIgL1hZWiAt
MC4yNjk5ODkgNDEuMDM4MTE2NSBudWxsXQovc2xpZGUuNTIgWzM4OSAwIFIgL1hZWiAtMC4yNjk5
ODkgMTMuMDQyNDgwNSBudWxsXQovc2xpZGUuNTMgWzM5NCAwIFIgL1hZWiAtMC4yNjk5ODkgMTMu
MDQyNDgwNSBudWxsXT4+ZW5kb2JqCjQyNSAwIG9iago8PC9UeXBlL01ldGFkYXRhCi9TdWJ0eXBl
L1hNTC9MZW5ndGggMTUyNT4+c3RyZWFtCjw/eHBhY2tldCBiZWdpbj0n77u/JyBpZD0nVzVNME1w
Q2VoaUh6cmVTek5UY3prYzlkJz8+Cjw/YWRvYmUteGFwLWZpbHRlcnMgZXNjPSJDUkxGIj8+Cjx4
OnhtcG1ldGEgeG1sbnM6eD0nYWRvYmU6bnM6bWV0YS8nIHg6eG1wdGs9J1hNUCB0b29sa2l0IDIu
OS4xLTEzLCBmcmFtZXdvcmsgMS42Jz4KPHJkZjpSREYgeG1sbnM6cmRmPSdodHRwOi8vd3d3Lncz
Lm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjJyB4bWxuczppWD0naHR0cDovL25zLmFkb2Jl
LmNvbS9pWC8xLjAvJz4KPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9Jzg2Mzk3N2ZjLWI2YzYt
MTFlYy0wMDAwLTI1YTQyYWY4NDRhMycgeG1sbnM6cGRmPSdodHRwOi8vbnMuYWRvYmUuY29tL3Bk
Zi8xLjMvJz48cGRmOlByb2R1Y2VyPmR2aXBzICsgR1BMIEdob3N0c2NyaXB0IDkuMDI8L3BkZjpQ
cm9kdWNlcj4KPHBkZjpLZXl3b3Jkcz4oKTwvcGRmOktleXdvcmRzPgo8L3JkZjpEZXNjcmlwdGlv
bj4KPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9Jzg2Mzk3N2ZjLWI2YzYtMTFlYy0wMDAwLTI1
YTQyYWY4NDRhMycgeG1sbnM6eG1wPSdodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvJz48eG1w
Ok1vZGlmeURhdGU+MjAxMi0wNC0wNFQxNjowMDozMC0wNzowMDwveG1wOk1vZGlmeURhdGU+Cjx4
bXA6Q3JlYXRlRGF0ZT4yMDEyLTA0LTA0VDE2OjAwOjMwLTA3OjAwPC94bXA6Q3JlYXRlRGF0ZT4K
PHhtcDpDcmVhdG9yVG9vbD5MYVRlWCB3aXRoIHBvd2VyZG90IGNsYXNzPC94bXA6Q3JlYXRvclRv
b2w+PC9yZGY6RGVzY3JpcHRpb24+CjxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSc4NjM5Nzdm
Yy1iNmM2LTExZWMtMDAwMC0yNWE0MmFmODQ0YTMnIHhtbG5zOnhhcE1NPSdodHRwOi8vbnMuYWRv
YmUuY29tL3hhcC8xLjAvbW0vJyB4YXBNTTpEb2N1bWVudElEPSc4NjM5NzdmYy1iNmM2LTExZWMt
MDAwMC0yNWE0MmFmODQ0YTMnLz4KPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9Jzg2Mzk3N2Zj
LWI2YzYtMTFlYy0wMDAwLTI1YTQyYWY4NDRhMycgeG1sbnM6ZGM9J2h0dHA6Ly9wdXJsLm9yZy9k
Yy9lbGVtZW50cy8xLjEvJyBkYzpmb3JtYXQ9J2FwcGxpY2F0aW9uL3BkZic+PGRjOnRpdGxlPjxy
ZGY6QWx0PjxyZGY6bGkgeG1sOmxhbmc9J3gtZGVmYXVsdCc+KCk8L3JkZjpsaT48L3JkZjpBbHQ+
PC9kYzp0aXRsZT48ZGM6Y3JlYXRvcj48cmRmOlNlcT48cmRmOmxpPigpPC9yZGY6bGk+PC9yZGY6
U2VxPjwvZGM6Y3JlYXRvcj48ZGM6ZGVzY3JpcHRpb24+PHJkZjpTZXE+PHJkZjpsaT4oKTwvcmRm
OmxpPjwvcmRmOlNlcT48L2RjOmRlc2NyaXB0aW9uPjwvcmRmOkRlc2NyaXB0aW9uPgo8L3JkZjpS
REY+CjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCjw/eHBhY2tl
dCBlbmQ9J3cnPz4KZW5kc3RyZWFtCmVuZG9iagoyIDAgb2JqCjw8L1Byb2R1Y2VyKGR2aXBzICsg
R1BMIEdob3N0c2NyaXB0IDkuMDIpCi9DcmVhdGlvbkRhdGUoRDoyMDEyMDQwNDE2MDAzMC0wNycw
MCcpCi9Nb2REYXRlKEQ6MjAxMjA0MDQxNjAwMzAtMDcnMDAnKQovQ3JlYXRvcihMYVRlWCB3aXRo
IHBvd2VyZG90IGNsYXNzKQovVGl0bGUoKQovU3ViamVjdCgpCi9BdXRob3IoKQovS2V5d29yZHMo
KT4+ZW5kb2JqCnhyZWYKMCA0MjYKMDAwMDAwMDAwMCA2NTUzNSBmIAowMDAwMjEzODQxIDAwMDAw
IG4gCjAwMDA0OTAxMTUgMDAwMDAgbiAKMDAwMDIxMzE4NyAwMDAwMCBuIAowMDAwMjAwNTQzIDAw
MDAwIG4gCjAwMDA0NzU0MTAgMDAwMDAgbiAKMDAwMDIxMzc4NCAwMDAwMCBuIAowMDAwMjE1MTA3
IDAwMDAwIG4gCjAwMDAyMTUxNzcgMDAwMDAgbiAKMDAwMDIxNzIyNyAwMDAwMCBuIAowMDAwMjE1
MjU5IDAwMDAwIG4gCjAwMDAyMTUzMzEgMDAwMDAgbiAKMDAwMDIxNTQxNyAwMDAwMCBuIAowMDAw
MjE1NTA1IDAwMDAwIG4gCjAwMDAyMTU1OTggMDAwMDAgbiAKMDAwMDIxNTY4NSAwMDAwMCBuIAow
MDAwMjE1NzcxIDAwMDAwIG4gCjAwMDAyMTU4NTggMDAwMDAgbiAKMDAwMDIxNTk0NyAwMDAwMCBu
IAowMDAwMjE2MDM2IDAwMDAwIG4gCjAwMDAyMTYxMzAgMDAwMDAgbiAKMDAwMDIxNjIxOCAwMDAw
MCBuIAowMDAwMjE2MzA0IDAwMDAwIG4gCjAwMDAyMTYzOTkgMDAwMDAgbiAKMDAwMDIxNjQ4NSAw
MDAwMCBuIAowMDAwMjE2NTcxIDAwMDAwIG4gCjAwMDAyMTY2NjQgMDAwMDAgbiAKMDAwMDIxNjc4
OCAwMDAwMCBuIAowMDAwMjE2ODg5IDAwMDAwIG4gCjAwMDAyMTY5ODIgMDAwMDAgbiAKMDAwMDIx
NzA2OCAwMDAwMCBuIAowMDAwMjE3MTU0IDAwMDAwIG4gCjAwMDAyMTgyNDggMDAwMDAgbiAKMDAw
MDIxNzM4OSAwMDAwMCBuIAowMDAwMjE3NDYzIDAwMDAwIG4gCjAwMDAyMTc1NTAgMDAwMDAgbiAK
MDAwMDIxNzYzNyAwMDAwMCBuIAowMDAwMjE3NzUwIDAwMDAwIG4gCjAwMDAyMTc4MzcgMDAwMDAg
biAKMDAwMDIxNzk1NCAwMDAwMCBuIAowMDAwMjE4MDUxIDAwMDAwIG4gCjAwMDAyMTgxNTIgMDAw
MDAgbiAKMDAwMDIxOTc3NCAwMDAwMCBuIAowMDAwMjE4Mzg3IDAwMDAwIG4gCjAwMDAyMTg0NjEg
MDAwMDAgbiAKMDAwMDIxODU2MSAwMDAwMCBuIAowMDAwMjE4NjYxIDAwMDAwIG4gCjAwMDAyMTg3
NjEgMDAwMDAgbiAKMDAwMDIxODg2NSAwMDAwMCBuIAowMDAwMjE4OTY5IDAwMDAwIG4gCjAwMDAy
MTkwNzMgMDAwMDAgbiAKMDAwMDIxOTE5MSAwMDAwMCBuIAowMDAwMjE5MzEwIDAwMDAwIG4gCjAw
MDAyMTk0MDcgMDAwMDAgbiAKMDAwMDIxOTQ5NCAwMDAwMCBuIAowMDAwMjE5NTgxIDAwMDAwIG4g
CjAwMDAyMTk3MDAgMDAwMDAgbiAKMDAwMDQ3NTI5NCAwMDAwMCBuIAowMDAwMjE5OTMzIDAwMDAw
IG4gCjAwMDAwMDAwMTUgMDAwMDAgbiAKMDAwMDAwMzIwNSAwMDAwMCBuIAowMDAwMjIwMDAxIDAw
MDAwIG4gCjAwMDA0NjI1NzMgMDAwMDAgbiAKMDAwMDQ2MjkxNCAwMDAwMCBuIAowMDAwNDczNzAy
IDAwMDAwIG4gCjAwMDA0NjI1MDMgMDAwMDAgbiAKMDAwMDIyMDA0MyAwMDAwMCBuIAowMDAwMjIw
MDc1IDAwMDAwIG4gCjAwMDAyMDA3MjkgMDAwMDAgbiAKMDAwMDAwMzIyNiAwMDAwMCBuIAowMDAw
MDA2MTYxIDAwMDAwIG4gCjAwMDAyMjAxMjkgMDAwMDAgbiAKMDAwMDIyMDE2MSAwMDAwMCBuIAow
MDAwMjAwOTE2IDAwMDAwIG4gCjAwMDAwMDYxODIgMDAwMDAgbiAKMDAwMDAwNjMzMiAwMDAwMCBu
IAowMDAwMjIwMjY4IDAwMDAwIG4gCjAwMDAyMjAyMDQgMDAwMDAgbiAKMDAwMDIyMDIzNiAwMDAw
MCBuIAowMDAwMjAxMTA4IDAwMDAwIG4gCjAwMDAwMDYzNTEgMDAwMDAgbiAKMDAwMDAwOTQ3NyAw
MDAwMCBuIAowMDAwNDYxNTk0IDAwMDAwIG4gCjAwMDA0NjQyOTQgMDAwMDAgbiAKMDAwMDIyNjU2
MCAwMDAwMCBuIAowMDAwMjI2NTkyIDAwMDAwIG4gCjAwMDAyMDEyOTUgMDAwMDAgbiAKMDAwMDAw
OTQ5OCAwMDAwMCBuIAowMDAwMDEyMzkzIDAwMDAwIG4gCjAwMDA0NjA5ODMgMDAwMDAgbiAKMDAw
MDQ2MzMyMCAwMDAwMCBuIAowMDAwMjI2NjU3IDAwMDAwIG4gCjAwMDAyMjY2ODkgMDAwMDAgbiAK
MDAwMDIwMTQ4MiAwMDAwMCBuIAowMDAwMDEyNDE0IDAwMDAwIG4gCjAwMDAwMTUzNzIgMDAwMDAg
biAKMDAwMDIyNjc1NCAwMDAwMCBuIAowMDAwMjI2Nzg2IDAwMDAwIG4gCjAwMDAyMDE2NjkgMDAw
MDAgbiAKMDAwMDAxNTM5MyAwMDAwMCBuIAowMDAwMDE4Mzk5IDAwMDAwIG4gCjAwMDAyMjY4NTEg
MDAwMDAgbiAKMDAwMDIyNjg4NCAwMDAwMCBuIAowMDAwMjAxODU4IDAwMDAwIG4gCjAwMDAwMTg0
MjEgMDAwMDAgbiAKMDAwMDAyMTQ4MiAwMDAwMCBuIAowMDAwMjI2OTUwIDAwMDAwIG4gCjAwMDAy
MjY5ODMgMDAwMDAgbiAKMDAwMDIwMjA0OSAwMDAwMCBuIAowMDAwMDIxNTA0IDAwMDAwIG4gCjAw
MDAwMjQ2MjcgMDAwMDAgbiAKMDAwMDIyNzA0OSAwMDAwMCBuIAowMDAwMjI3MDgyIDAwMDAwIG4g
CjAwMDAyMDIyNDAgMDAwMDAgbiAKMDAwMDAyNDY0OSAwMDAwMCBuIAowMDAwMDI4MDA3IDAwMDAw
IG4gCjAwMDAyMjcxNTkgMDAwMDAgbiAKMDAwMDIyNzE5MiAwMDAwMCBuIAowMDAwMjAyNDMxIDAw
MDAwIG4gCjAwMDAwMjgwMjkgMDAwMDAgbiAKMDAwMDAzMTM0MCAwMDAwMCBuIAowMDAwMjI3MjY5
IDAwMDAwIG4gCjAwMDAyMjczMDIgMDAwMDAgbiAKMDAwMDIwMjYyMiAwMDAwMCBuIAowMDAwMDMx
MzYyIDAwMDAwIG4gCjAwMDAwMzQ1OTkgMDAwMDAgbiAKMDAwMDIyNzM3OSAwMDAwMCBuIAowMDAw
MjI3NDEyIDAwMDAwIG4gCjAwMDAyMDI4MTMgMDAwMDAgbiAKMDAwMDAzNDYyMSAwMDAwMCBuIAow
MDAwMDM0OTA5IDAwMDAwIG4gCjAwMDAyMjc1NTcgMDAwMDAgbiAKMDAwMDIyNzQ4OSAwMDAwMCBu
IAowMDAwMjI3NTIyIDAwMDAwIG4gCjAwMDAyMzk0ODcgMDAwMDAgbiAKMDAwMDIwMzAyOSAwMDAw
MCBuIAowMDAwMDM0OTMwIDAwMDAwIG4gCjAwMDAwMzgyNzIgMDAwMDAgbiAKMDAwMDQ2MzE1NiAw
MDAwMCBuIAowMDAwNDc0MzM5IDAwMDAwIG4gCjAwMDAyMzk1MjAgMDAwMDAgbiAKMDAwMDIzOTU1
MyAwMDAwMCBuIAowMDAwMjAzMjIwIDAwMDAwIG4gCjAwMDAwMzgyOTQgMDAwMDAgbiAKMDAwMDA0
MTUzMSAwMDAwMCBuIAowMDAwMjM5NjQzIDAwMDAwIG4gCjAwMDAyMzk2NzYgMDAwMDAgbiAKMDAw
MDIwMzQxMSAwMDAwMCBuIAowMDAwMDQxNTUzIDAwMDAwIG4gCjAwMDAwNDQ5MjQgMDAwMDAgbiAK
MDAwMDIzOTc2NiAwMDAwMCBuIAowMDAwMjM5Nzk5IDAwMDAwIG4gCjAwMDAyMDM2MDIgMDAwMDAg
biAKMDAwMDA0NDk0NiAwMDAwMCBuIAowMDAwMDQ4NDg2IDAwMDAwIG4gCjAwMDA0NjI3NTUgMDAw
MDAgbiAKMDAwMDQ3Mjk2MSAwMDAwMCBuIAowMDAwMjM5ODg5IDAwMDAwIG4gCjAwMDAyMzk5MjIg
MDAwMDAgbiAKMDAwMDIwMzc5MyAwMDAwMCBuIAowMDAwMDQ4NTA4IDAwMDAwIG4gCjAwMDAwNTE5
ODEgMDAwMDAgbiAKMDAwMDI0MDAxMiAwMDAwMCBuIAowMDAwMjQwMDQ1IDAwMDAwIG4gCjAwMDAy
MDM5ODQgMDAwMDAgbiAKMDAwMDA1MjAwMyAwMDAwMCBuIAowMDAwMDU0OTE4IDAwMDAwIG4gCjAw
MDAyNDAxMzUgMDAwMDAgbiAKMDAwMDI0MDE2OCAwMDAwMCBuIAowMDAwMjA0MTc1IDAwMDAwIG4g
CjAwMDAwNTQ5NDAgMDAwMDAgbiAKMDAwMDA1NTA5MyAwMDAwMCBuIAowMDAwMjQwMjgwIDAwMDAw
IG4gCjAwMDAyNDAyMTIgMDAwMDAgbiAKMDAwMDI0MDI0NSAwMDAwMCBuIAowMDAwMjA0MzcxIDAw
MDAwIG4gCjAwMDAwNTUxMTMgMDAwMDAgbiAKMDAwMDA1ODMyNyAwMDAwMCBuIAowMDAwMzM4NTc2
IDAwMDAwIG4gCjAwMDAzMzg2MDkgMDAwMDAgbiAKMDAwMDIwNDU2MiAwMDAwMCBuIAowMDAwMDU4
MzQ5IDAwMDAwIG4gCjAwMDAwNjE1NzEgMDAwMDAgbiAKMDAwMDMzODY1MyAwMDAwMCBuIAowMDAw
MzM4Njg2IDAwMDAwIG4gCjAwMDAyMDQ3NTMgMDAwMDAgbiAKMDAwMDA2MTU5MyAwMDAwMCBuIAow
MDAwMDY0NzM4IDAwMDAwIG4gCjAwMDAzMzg3MzAgMDAwMDAgbiAKMDAwMDMzODc2MyAwMDAwMCBu
IAowMDAwMjA0OTQ0IDAwMDAwIG4gCjAwMDAwNjQ3NjAgMDAwMDAgbiAKMDAwMDA2ODEzNiAwMDAw
MCBuIAowMDAwMzM4ODQwIDAwMDAwIG4gCjAwMDAzMzg4NzMgMDAwMDAgbiAKMDAwMDIwNTEzNSAw
MDAwMCBuIAowMDAwMDY4MTU4IDAwMDAwIG4gCjAwMDAwNzE1NjIgMDAwMDAgbiAKMDAwMDMzODk2
MyAwMDAwMCBuIAowMDAwMzM4OTk2IDAwMDAwIG4gCjAwMDAyMDUzMjYgMDAwMDAgbiAKMDAwMDA3
MTU4NCAwMDAwMCBuIAowMDAwMDc0NDkzIDAwMDAwIG4gCjAwMDAzNzkzNjQgMDAwMDAgbiAKMDAw
MDMzOTE2NyAwMDAwMCBuIAowMDAwMzM5MDg2IDAwMDAwIG4gCjAwMDAzMzkxMTkgMDAwMDAgbiAK
MDAwMDQzODkyNyAwMDAwMCBuIAowMDAwMjA1NTQyIDAwMDAwIG4gCjAwMDAwNzQ1MTUgMDAwMDAg
biAKMDAwMDA3NzQ2NiAwMDAwMCBuIAowMDAwNDM4OTgyIDAwMDAwIG4gCjAwMDA0MzkwMTUgMDAw
MDAgbiAKMDAwMDIwNTczMyAwMDAwMCBuIAowMDAwMDc3NDg4IDAwMDAwIG4gCjAwMDAwODAzODUg
MDAwMDAgbiAKMDAwMDQ2MTUyMCAwMDAwMCBuIAowMDAwNDM5MDU5IDAwMDAwIG4gCjAwMDA0Mzkw
OTIgMDAwMDAgbiAKMDAwMDIwNTkyNCAwMDAwMCBuIAowMDAwMDgwNDA3IDAwMDAwIG4gCjAwMDAw
ODMzNjQgMDAwMDAgbiAKMDAwMDQzOTE0OSAwMDAwMCBuIAowMDAwNDM5MTgyIDAwMDAwIG4gCjAw
MDAyMDYxMTUgMDAwMDAgbiAKMDAwMDA4MzM4NiAwMDAwMCBuIAowMDAwMDg2Mzc5IDAwMDAwIG4g
CjAwMDA0MzkyMjYgMDAwMDAgbiAKMDAwMDQzOTI1OSAwMDAwMCBuIAowMDAwMjA2MzA2IDAwMDAw
IG4gCjAwMDAwODY0MDEgMDAwMDAgbiAKMDAwMDA4OTI4MyAwMDAwMCBuIAowMDAwNDM5MzE0IDAw
MDAwIG4gCjAwMDA0MzkzNDcgMDAwMDAgbiAKMDAwMDIwNjQ5NyAwMDAwMCBuIAowMDAwMDg5MzA1
IDAwMDAwIG4gCjAwMDAwOTIxNTcgMDAwMDAgbiAKMDAwMDQzOTM5MSAwMDAwMCBuIAowMDAwNDM5
NDI0IDAwMDAwIG4gCjAwMDAyMDY2ODggMDAwMDAgbiAKMDAwMDA5MjE3OSAwMDAwMCBuIAowMDAw
MDk1MTM5IDAwMDAwIG4gCjAwMDA0Mzk0NjggMDAwMDAgbiAKMDAwMDQzOTUwMSAwMDAwMCBuIAow
MDAwMjA2ODc5IDAwMDAwIG4gCjAwMDAwOTUxNjEgMDAwMDAgbiAKMDAwMDEwMDI2OSAwMDAwMCBu
IAowMDAwNDM5NTQ1IDAwMDAwIG4gCjAwMDA0Mzk1OTAgMDAwMDAgbiAKMDAwMDQzOTYzNiAwMDAw
MCBuIAowMDAwNDM5Njk1IDAwMDAwIG4gCjAwMDAyMDcwNzAgMDAwMDAgbiAKMDAwMDEwMDI5MSAw
MDAwMCBuIAowMDAwMTAzMjcxIDAwMDAwIG4gCjAwMDA0Mzk3NzIgMDAwMDAgbiAKMDAwMDQzOTgw
NSAwMDAwMCBuIAowMDAwMjA3MjYxIDAwMDAwIG4gCjAwMDAxMDMyOTMgMDAwMDAgbiAKMDAwMDEw
ODUzMyAwMDAwMCBuIAowMDAwNDM5ODYyIDAwMDAwIG4gCjAwMDA0Mzk5MjEgMDAwMDAgbiAKMDAw
MDIwNzQ1MiAwMDAwMCBuIAowMDAwMTA4NTU1IDAwMDAwIG4gCjAwMDAxMTE4ODMgMDAwMDAgbiAK
MDAwMDQzOTk5OCAwMDAwMCBuIAowMDAwNDQwMDMxIDAwMDAwIG4gCjAwMDAyMDc2NDMgMDAwMDAg
biAKMDAwMDExMTkwNSAwMDAwMCBuIAowMDAwMTE0OTc3IDAwMDAwIG4gCjAwMDA0NDAwOTcgMDAw
MDAgbiAKMDAwMDQ0MDEzMCAwMDAwMCBuIAowMDAwMjA3ODM0IDAwMDAwIG4gCjAwMDAxMTQ5OTkg
MDAwMDAgbiAKMDAwMDExODQ0MyAwMDAwMCBuIAowMDAwNDQwMTk2IDAwMDAwIG4gCjAwMDA0NDAy
MjkgMDAwMDAgbiAKMDAwMDIwODAyNSAwMDAwMCBuIAowMDAwMTE4NDY1IDAwMDAwIG4gCjAwMDAx
MjE1NTggMDAwMDAgbiAKMDAwMDQ0MDI5NSAwMDAwMCBuIAowMDAwNDQwMzI4IDAwMDAwIG4gCjAw
MDAyMDgyMTYgMDAwMDAgbiAKMDAwMDEyMTU4MCAwMDAwMCBuIAowMDAwMTI0NDMzIDAwMDAwIG4g
CjAwMDA0NDAzOTQgMDAwMDAgbiAKMDAwMDQ0MDQyNyAwMDAwMCBuIAowMDAwMjA4NDA3IDAwMDAw
IG4gCjAwMDAxMjQ0NTUgMDAwMDAgbiAKMDAwMDEyNzM3MiAwMDAwMCBuIAowMDAwNDQwNDcxIDAw
MDAwIG4gCjAwMDA0NDA1MDQgMDAwMDAgbiAKMDAwMDIwODU5OCAwMDAwMCBuIAowMDAwMTI3Mzk0
IDAwMDAwIG4gCjAwMDAxMzAzNTkgMDAwMDAgbiAKMDAwMDQ0MDU0OCAwMDAwMCBuIAowMDAwNDQw
NTgxIDAwMDAwIG4gCjAwMDAyMDg3ODkgMDAwMDAgbiAKMDAwMDEzMDM4MSAwMDAwMCBuIAowMDAw
MTMzNDEzIDAwMDAwIG4gCjAwMDA0NDA2MjUgMDAwMDAgbiAKMDAwMDQ0MDY1OCAwMDAwMCBuIAow
MDAwMjA4OTgwIDAwMDAwIG4gCjAwMDAxMzM0MzUgMDAwMDAgbiAKMDAwMDEzNjQ0MCAwMDAwMCBu
IAowMDAwNDQwNzEzIDAwMDAwIG4gCjAwMDA0NDA3NDYgMDAwMDAgbiAKMDAwMDIwOTE3MSAwMDAw
MCBuIAowMDAwMTM2NDYyIDAwMDAwIG4gCjAwMDAxMzk1NDMgMDAwMDAgbiAKMDAwMDQ0MDgxMiAw
MDAwMCBuIAowMDAwNDQwODQ1IDAwMDAwIG4gCjAwMDAyMDkzNjIgMDAwMDAgbiAKMDAwMDEzOTU2
NSAwMDAwMCBuIAowMDAwMTQyNjcyIDAwMDAwIG4gCjAwMDA0NDA5MTEgMDAwMDAgbiAKMDAwMDQ0
MDk0NCAwMDAwMCBuIAowMDAwMjA5NTUzIDAwMDAwIG4gCjAwMDAxNDI2OTQgMDAwMDAgbiAKMDAw
MDE0NTgyMCAwMDAwMCBuIAowMDAwNDQxMDEwIDAwMDAwIG4gCjAwMDA0NDEwNDMgMDAwMDAgbiAK
MDAwMDIwOTc0NCAwMDAwMCBuIAowMDAwMTQ1ODQyIDAwMDAwIG4gCjAwMDAxNDg5ODcgMDAwMDAg
biAKMDAwMDQ0MTEwOSAwMDAwMCBuIAowMDAwNDQxMTQyIDAwMDAwIG4gCjAwMDAyMDk5MzUgMDAw
MDAgbiAKMDAwMDE0OTAwOSAwMDAwMCBuIAowMDAwMTUyMjM0IDAwMDAwIG4gCjAwMDA0NDEyMDgg
MDAwMDAgbiAKMDAwMDQ0MTI0MSAwMDAwMCBuIAowMDAwMjEwMTI2IDAwMDAwIG4gCjAwMDAxNTIy
NTYgMDAwMDAgbiAKMDAwMDE1NTQ3OCAwMDAwMCBuIAowMDAwNDQxMzA3IDAwMDAwIG4gCjAwMDA0
NDEzNDAgMDAwMDAgbiAKMDAwMDIxMDMxNyAwMDAwMCBuIAowMDAwMTU1NTAwIDAwMDAwIG4gCjAw
MDAxNTkxNzcgMDAwMDAgbiAKMDAwMDQ2MjE0NyAwMDAwMCBuIAowMDAwNDcwMjY2IDAwMDAwIG4g
CjAwMDA0NDEzOTUgMDAwMDAgbiAKMDAwMDQ0MTQyOCAwMDAwMCBuIAowMDAwMjEwNTA4IDAwMDAw
IG4gCjAwMDAxNTkxOTkgMDAwMDAgbiAKMDAwMDE2MjU3NiAwMDAwMCBuIAowMDAwNDQxNTA3IDAw
MDAwIG4gCjAwMDA0NDE1NDAgMDAwMDAgbiAKMDAwMDIxMDY5OSAwMDAwMCBuIAowMDAwMTYyNTk4
IDAwMDAwIG4gCjAwMDAxNjU5NDEgMDAwMDAgbiAKMDAwMDQ0MTYzMCAwMDAwMCBuIAowMDAwNDQx
NjYzIDAwMDAwIG4gCjAwMDAyMTA4OTAgMDAwMDAgbiAKMDAwMDE2NTk2MyAwMDAwMCBuIAowMDAw
MTY5MzY2IDAwMDAwIG4gCjAwMDA0NDE3NDIgMDAwMDAgbiAKMDAwMDQ0MTc3NSAwMDAwMCBuIAow
MDAwMjExMDgxIDAwMDAwIG4gCjAwMDAxNjkzODggMDAwMDAgbiAKMDAwMDE3MjcxMyAwMDAwMCBu
IAowMDAwNDQxODU0IDAwMDAwIG4gCjAwMDA0NDE4ODcgMDAwMDAgbiAKMDAwMDIxMTI3MiAwMDAw
MCBuIAowMDAwMTcyNzM1IDAwMDAwIG4gCjAwMDAxNzU3NTggMDAwMDAgbiAKMDAwMDQ0MTk2NiAw
MDAwMCBuIAowMDAwNDQxOTk5IDAwMDAwIG4gCjAwMDAyMTE0NjMgMDAwMDAgbiAKMDAwMDE3NTc4
MCAwMDAwMCBuIAowMDAwMTc4NjkxIDAwMDAwIG4gCjAwMDA0NDIwNjUgMDAwMDAgbiAKMDAwMDQ0
MjA5OCAwMDAwMCBuIAowMDAwMjExNjU0IDAwMDAwIG4gCjAwMDAxNzg3MTMgMDAwMDAgbiAKMDAw
MDE4MTU3MCAwMDAwMCBuIAowMDAwNDQyMTQyIDAwMDAwIG4gCjAwMDA0NDIxNzUgMDAwMDAgbiAK
MDAwMDIxMTg0NSAwMDAwMCBuIAowMDAwMTgxNTkyIDAwMDAwIG4gCjAwMDAxODQ4ODAgMDAwMDAg
biAKMDAwMDQ0MjIxOSAwMDAwMCBuIAowMDAwNDQyMjUyIDAwMDAwIG4gCjAwMDAyMTIwMzYgMDAw
MDAgbiAKMDAwMDE4NDkwMiAwMDAwMCBuIAowMDAwMTg1MDU3IDAwMDAwIG4gCjAwMDA0NDIzODYg
MDAwMDAgbiAKMDAwMDQ0MjMxOCAwMDAwMCBuIAowMDAwNDQyMzUxIDAwMDAwIG4gCjAwMDAyMTIy
MzIgMDAwMDAgbiAKMDAwMDE4NTA3NyAwMDAwMCBuIAowMDAwMTg4MDI3IDAwMDAwIG4gCjAwMDA0
NjAyNTQgMDAwMDAgbiAKMDAwMDQ2MDI4NyAwMDAwMCBuIAowMDAwMjEyNDIzIDAwMDAwIG4gCjAw
MDAxODgwNDkgMDAwMDAgbiAKMDAwMDE5MTA2MSAwMDAwMCBuIAowMDAwNDYwMzQyIDAwMDAwIG4g
CjAwMDA0NjAzNzUgMDAwMDAgbiAKMDAwMDIxMjYxNCAwMDAwMCBuIAowMDAwMTkxMDgzIDAwMDAw
IG4gCjAwMDAxOTQxNzQgMDAwMDAgbiAKMDAwMDQ2MDQ0MSAwMDAwMCBuIAowMDAwNDYwNDc0IDAw
MDAwIG4gCjAwMDAyMTI4MDUgMDAwMDAgbiAKMDAwMDE5NDE5NiAwMDAwMCBuIAowMDAwMTk3Mjg3
IDAwMDAwIG4gCjAwMDA0NjA1NDAgMDAwMDAgbiAKMDAwMDQ2MDU3MyAwMDAwMCBuIAowMDAwMjEy
OTk2IDAwMDAwIG4gCjAwMDAxOTczMDkgMDAwMDAgbiAKMDAwMDIwMDUyMSAwMDAwMCBuIAowMDAw
NDYwNjM5IDAwMDAwIG4gCjAwMDA0NjA2NzIgMDAwMDAgbiAKMDAwMDQ2MzU5NSAwMDAwMCBuIAow
MDAwNDY0ODU0IDAwMDAwIG4gCjAwMDA0NzA1ODIgMDAwMDAgbiAKMDAwMDQ3MzE3NiAwMDAwMCBu
IAowMDAwNDczOTI2IDAwMDAwIG4gCjAwMDA0NzQ1OTMgMDAwMDAgbiAKMDAwMDQ2MDczOCAwMDAw
MCBuIAowMDAwNDYxMzY1IDAwMDAwIG4gCjAwMDA0NjIwNTQgMDAwMDAgbiAKMDAwMDQ2MjY1NSAw
MDAwMCBuIAowMDAwNDYzMDYxIDAwMDAwIG4gCjAwMDA0ODg1MTIgMDAwMDAgbiAKdHJhaWxlcgo8
PCAvU2l6ZSA0MjYgL1Jvb3QgMSAwIFIgL0luZm8gMiAwIFIKL0lEIFs8RkEyMERCQzY3MEEwNTk3
NUNFREY2MkE2MUUwQjhCN0U+PEZBMjBEQkM2NzBBMDU5NzVDRURGNjJBNjFFMEI4QjdFPl0KPj4K
c3RhcnR4cmVmCjQ5MDMyNAolJUVPRgo=
--bcaec51b1bb9837b4304cec93c59--
.
Author: Jens Maurer <Jens.Maurer@gmx.net>
Date: Sun, 18 Nov 2012 20:37:13 +0100
Raw View
On 11/18/2012 07:33 PM, Faisal Vali wrote:
> I have included a link to Andrei's Lang.Next Slides (the first 30 are
> pertinent to this post) in which he attempts to demonstrate why he
> thinks the D solution ('scope statement') is superior to RAII.
Using C++ and lambdas and std::uncaught_exception(), I think we
should be able to get to the following, syntax-wise:
<action>
auto cleanup1 = make_cleanup( [&]() { <cleanup> } );
auto failure1 = make_failure( [&]() { <rollback> } );
and composition is as easy as in D.
The cleanup object's destructor would unconditionally execute the
lambda.
The failure object's destructor would only execute the lambda
if std::uncaught_exception() is true, i.e. the destructor
is invoked during stack unwinding.
Jens
--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Sun, 18 Nov 2012 11:57:39 -0800 (PST)
Raw View
------=_Part_634_18532922.1353268659022
Content-Type: text/plain; charset=ISO-8859-1
On Sunday, November 18, 2012 11:37:23 AM UTC-8, Jens Maurer wrote:
>
> On 11/18/2012 07:33 PM, Faisal Vali wrote:
> > I have included a link to Andrei's Lang.Next Slides (the first 30 are
> > pertinent to this post) in which he attempts to demonstrate why he
> > thinks the D solution ('scope statement') is superior to RAII.
>
> Using C++ and lambdas and std::uncaught_exception(), I think we
> should be able to get to the following, syntax-wise:
>
> <action>
> auto cleanup1 = make_cleanup( [&]() { <cleanup> } );
> auto failure1 = make_failure( [&]() { <rollback> } );
>
> and composition is as easy as in D.
>
> The cleanup object's destructor would unconditionally execute the
> lambda.
> The failure object's destructor would only execute the lambda
> if std::uncaught_exception() is true, i.e. the destructor
> is invoked during stack unwinding.
>
That's not sufficient for the failure case<http://stackoverflow.com/q/13001792/734069>.
You only want the failure to happen if the destructor is being called
because that particular scope is being unwound.
If you were to put one of these objects into a class's destructor (so that
any stack unwinding from exceptions thrown within the destructor would be
detected). But it would *also* detect stack unwinding due to exceptions
thrown which caused that particular class's destructor to be fired. Just
look at the link for an example.
Besides, how is this all not a giant kludge? If you want this feature,
propose it as a real, legitimate language feature, not some hack with
lambdas and such. Because if it goes in as a hack, when someone does want
it in the core language, they'll just say, "Use the hack."
--
------=_Part_634_18532922.1353268659022
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
<br><br>On Sunday, November 18, 2012 11:37:23 AM UTC-8, Jens Maurer wrote:<=
blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;bord=
er-left: 1px #ccc solid;padding-left: 1ex;">On 11/18/2012 07:33 PM, Faisal =
Vali wrote:
<br>> I have included a link to Andrei's Lang.Next Slides (the first 30 =
are
<br>> pertinent to this post) in which he attempts to demonstrate why he
<br>> thinks the D solution ('scope statement') is superior to RAII.
<br>
<br>Using C++ and lambdas and std::uncaught_exception(), I think we
<br>should be able to get to the following, syntax-wise:
<br>
<br><action>
<br>auto cleanup1 =3D make_cleanup( [&]() { <cleanup> } );
<br>auto failure1 =3D make_failure( [&]() { <rollback> } );
<br>
<br>and composition is as easy as in D.
<br>
<br>The cleanup object's destructor would unconditionally execute the
<br>lambda.
<br>The failure object's destructor would only execute the lambda
<br>if std::uncaught_exception() is true, i.e. the destructor
<br>is invoked during stack unwinding.<br></blockquote><div><br>That's <a h=
ref=3D"http://stackoverflow.com/q/13001792/734069">not sufficient for the f=
ailure case</a>. You only want the failure to happen if the destructor is b=
eing called because that particular scope is being unwound.<br><br>If you w=
ere to put one of these objects into a class's destructor (so that any stac=
k unwinding from exceptions thrown within the destructor would be detected)=
.. But it would <i>also</i> detect stack unwinding due to exceptions thrown =
which caused that particular class's destructor to be fired. Just look at t=
he link for an example.<br><br>Besides, how is this all not a giant kludge?=
If you want this feature, propose it as a real, legitimate language featur=
e, not some hack with lambdas and such. Because if it goes in as a hack, wh=
en someone does want it in the core language, they'll just say, "Use the ha=
ck."<br></div>
<p></p>
-- <br />
<br />
<br />
<br />
------=_Part_634_18532922.1353268659022--
.
Author: Ville Voutilainen <ville.voutilainen@gmail.com>
Date: Sun, 18 Nov 2012 22:12:15 +0200
Raw View
On 18 November 2012 21:57, Nicol Bolas <jmckesson@gmail.com> wrote:
> Besides, how is this all not a giant kludge? If you want this feature,
> propose it as a real, legitimate language feature, not some hack with
> lambdas and such. Because if it goes in as a hack, when someone does want it
> in the core language, they'll just say, "Use the hack."
What exactly do you mean by "this all"? Which part of the proposed library
facilities are "hacks"? So far I have seen zero reasons to add new language
features, the proposed library additions work just fine with the
existing language
facilities.
--
.
Author: grigorij1981@gmail.com
Date: Sun, 18 Nov 2012 12:37:22 -0800 (PST)
Raw View
------=_Part_124_27830670.1353271042895
Content-Type: text/plain; charset=ISO-8859-1
By the way, recently on boost mailing list Evgeny Panasyk proposed as
additions to BOOST_SCOPE_EXIT scope_failure and scope_success macros.
http://boost.2283326.n4.nabble.com/scope-exit-D-style-scope-failure-and-scope-success-in-C-td4636441.html
They cannot be implemented in standard-compliant way. He relies on
platform-specific functions. I guess that may be called 'a giand kludge'.
Interestingly BOOST_SCOPE_FAILURE may be implemented via lambda, but not
BOOST_SCOPE_SUCCESS.
But I think both may be good additions as language features.
Regards,
Gregory
--
------=_Part_124_27830670.1353271042895
Content-Type: text/html; charset=ISO-8859-1
<DIV> </DIV>
<DIV>By the way, recently on boost mailing list Evgeny Panasyk proposed as additions to BOOST_SCOPE_EXIT scope_failure and scope_success macros. </DIV>
<DIV> </DIV>
<DIV><A href="http://boost.2283326.n4.nabble.com/scope-exit-D-style-scope-failure-and-scope-success-in-C-td4636441.html">http://boost.2283326.n4.nabble.com/scope-exit-D-style-scope-failure-and-scope-success-in-C-td4636441.html</A></DIV>
<DIV> </DIV>
<DIV>They cannot be implemented in standard-compliant way. He relies on platform-specific functions. I guess that may be called 'a giand kludge'.</DIV>
<DIV>Interestingly BOOST_SCOPE_FAILURE may be implemented via lambda, but not BOOST_SCOPE_SUCCESS.</DIV>
<DIV>But I think both may be good additions as language features.</DIV>
<DIV> </DIV>
<DIV>Regards,</DIV>
<DIV>Gregory</DIV>
<DIV> </DIV>
<DIV> </DIV>
<p></p>
-- <br />
<br />
<br />
<br />
------=_Part_124_27830670.1353271042895--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Sun, 18 Nov 2012 13:06:55 -0800 (PST)
Raw View
------=_Part_575_2803182.1353272815359
Content-Type: text/plain; charset=ISO-8859-1
On Sunday, November 18, 2012 12:12:18 PM UTC-8, Ville Voutilainen wrote:
>
> On 18 November 2012 21:57, Nicol Bolas <jmck...@gmail.com <javascript:>>
> wrote:
> > Besides, how is this all not a giant kludge? If you want this feature,
> > propose it as a real, legitimate language feature, not some hack with
> > lambdas and such. Because if it goes in as a hack, when someone does
> want it
> > in the core language, they'll just say, "Use the hack."
>
> What exactly do you mean by "this all"? Which part of the proposed library
> facilities are "hacks"?
Well, ignoring the issue I pointed out where it doesn't work, it's a kludge
for the same reason that the safe-bool idiom is a kludge. It *functions*,
but it's a giant wart in the middle of a piece of source code. The
committee took steps to get rid of safe-bool, which required significant
changes to the spec language with regard to conversions. It required adding
this new concept of "contextual conversion to bool" as a back-door so that
`explicit operator bool()` would work in places we want it to, but not in
others.
The difference is that, where the safe-bool idiom could be tucked away in a
class declaration, only seen by those who read through the declaration,
this is going to be used *everywhere*.
It's a hack because it's easily and accidentally broken:
auto cleanup1 = make_cleanup( [&]() { <cleanup> } );
//Some code
auto cleanup1 = make_cleanup( [&]() { <more cleanup> } );
That's a compile error. This is not:
scope(exit) {<cleanup>}
//Some code
scope(exit) {<more cleanup>}
Yes, it's a simple thing to fix. But do you honestly want a bunch of auto
variable declarations, `std::make_cleanup` calls, and such cluttering up
functions?
We already have to make a language change (whether directly or indirectly
via a language-support-library change) to make the failure example actually
work properly. If we're going to make a language change, let's not mess
around and do it *right*.
So far I have seen zero reasons to add new language
> features, the proposed library additions work just fine with the
> existing language
> facilities.
>
--
------=_Part_575_2803182.1353272815359
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
<br><br>On Sunday, November 18, 2012 12:12:18 PM UTC-8, Ville Voutilainen w=
rote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8e=
x;border-left: 1px #ccc solid;padding-left: 1ex;">On 18 November 2012 21:57=
, Nicol Bolas <<a href=3D"javascript:" target=3D"_blank" gdf-obfuscated-=
mailto=3D"pIkeneWpj14J">jmck...@gmail.com</a>> wrote:
<br>> Besides, how is this all not a giant kludge? If you want this feat=
ure,
<br>> propose it as a real, legitimate language feature, not some hack w=
ith
<br>> lambdas and such. Because if it goes in as a hack, when someone do=
es want it
<br>> in the core language, they'll just say, "Use the hack."
<br>
<br>What exactly do you mean by "this all"? Which part of the proposed libr=
ary
<br>facilities are "hacks"?</blockquote><div><br>Well, ignoring the issue I=
pointed out where it doesn't work, it's a kludge for the same reason that =
the safe-bool idiom is a kludge. It <i>functions</i>, but it's a giant wart=
in the middle of a piece of source code. The committee took steps to get r=
id of safe-bool, which required significant changes to the spec language wi=
th regard to conversions. It required adding this new concept of "contextua=
l conversion to bool" as a back-door so that `explicit operator bool()` wou=
ld work in places we want it to, but not in others.<br><br>The difference i=
s that, where the safe-bool idiom could be tucked away in a class declarati=
on, only seen by those who read through the declaration, this is going to b=
e used <i>everywhere</i>.<br><br>It's a hack because it's easily and accide=
ntally broken:<br><br><div class=3D"prettyprint" style=3D"background-color:=
rgb(250, 250, 250); border-color: rgb(187, 187, 187); border-style: solid;=
border-width: 1px; word-wrap: break-word;"><code class=3D"prettyprint"><di=
v class=3D"subprettyprint"><span style=3D"color: #008;" class=3D"styled-by-=
prettify">auto</span><span style=3D"color: #000;" class=3D"styled-by-pretti=
fy"> cleanup1 </span><span style=3D"color: #660;" class=3D"styled-by-pretti=
fy">=3D</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> ma=
ke_cleanup</span><span style=3D"color: #660;" class=3D"styled-by-prettify">=
(</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> </span><=
span style=3D"color: #660;" class=3D"styled-by-prettify">[&]()</span><s=
pan style=3D"color: #000;" class=3D"styled-by-prettify"> </span><span style=
=3D"color: #660;" class=3D"styled-by-prettify">{</span><span style=3D"color=
: #000;" class=3D"styled-by-prettify"> </span><span style=3D"color: #080;" =
class=3D"styled-by-prettify"><cleanup></span><span style=3D"color: #0=
00;" class=3D"styled-by-prettify"> </span><span style=3D"color: #660;" clas=
s=3D"styled-by-prettify">}</span><span style=3D"color: #000;" class=3D"styl=
ed-by-prettify"> </span><span style=3D"color: #660;" class=3D"styled-by-pre=
ttify">);</span><span style=3D"color: #000;" class=3D"styled-by-prettify"><=
br></span><span style=3D"color: #800;" class=3D"styled-by-prettify">//Some =
code</span><span style=3D"color: #000;" class=3D"styled-by-prettify"><br></=
span><span style=3D"color: #008;" class=3D"styled-by-prettify">auto</span><=
span style=3D"color: #000;" class=3D"styled-by-prettify"> cleanup1 </span><=
span style=3D"color: #660;" class=3D"styled-by-prettify">=3D</span><span st=
yle=3D"color: #000;" class=3D"styled-by-prettify"> make_cleanup</span><span=
style=3D"color: #660;" class=3D"styled-by-prettify">(</span><span style=3D=
"color: #000;" class=3D"styled-by-prettify"> </span><span style=3D"color: #=
660;" class=3D"styled-by-prettify">[&]()</span><span style=3D"color: #0=
00;" class=3D"styled-by-prettify"> </span><span style=3D"color: #660;" clas=
s=3D"styled-by-prettify">{</span><span style=3D"color: #000;" class=3D"styl=
ed-by-prettify"> </span><span style=3D"color: #660;" class=3D"styled-by-pre=
ttify"><</span><span style=3D"color: #000;" class=3D"styled-by-prettify"=
>more cleanup</span><span style=3D"color: #660;" class=3D"styled-by-prettif=
y">></span><span style=3D"color: #000;" class=3D"styled-by-prettify"> </=
span><span style=3D"color: #660;" class=3D"styled-by-prettify">}</span><spa=
n style=3D"color: #000;" class=3D"styled-by-prettify"> </span><span style=
=3D"color: #660;" class=3D"styled-by-prettify">);</span></div></code></div>=
<br>That's a compile error. This is not:<br><br><div class=3D"prettyprint" =
style=3D"background-color: rgb(250, 250, 250); border-color: rgb(187, 187, =
187); border-style: solid; border-width: 1px; word-wrap: break-word;"><code=
class=3D"prettyprint"><div class=3D"subprettyprint"><span style=3D"color: =
#000;" class=3D"styled-by-prettify">scope</span><span style=3D"color: #660;=
" class=3D"styled-by-prettify">(</span><span style=3D"color: #008;" class=
=3D"styled-by-prettify">exit</span><span style=3D"color: #660;" class=3D"st=
yled-by-prettify">)</span><span style=3D"color: #000;" class=3D"styled-by-p=
rettify"> </span><span style=3D"color: #660;" class=3D"styled-by-prettify">=
{<</span><span style=3D"color: #000;" class=3D"styled-by-prettify">clean=
up</span><span style=3D"color: #660;" class=3D"styled-by-prettify">>}</s=
pan><span style=3D"color: #000;" class=3D"styled-by-prettify"><br></span><s=
pan style=3D"color: #800;" class=3D"styled-by-prettify">//Some code</span><=
span style=3D"color: #000;" class=3D"styled-by-prettify"><br>scope</span><s=
pan style=3D"color: #660;" class=3D"styled-by-prettify">(</span><span style=
=3D"color: #008;" class=3D"styled-by-prettify">exit</span><span style=3D"co=
lor: #660;" class=3D"styled-by-prettify">)</span><span style=3D"color: #000=
;" class=3D"styled-by-prettify"> </span><span style=3D"color: #660;" class=
=3D"styled-by-prettify">{<</span><span style=3D"color: #000;" class=3D"s=
tyled-by-prettify">more cleanup</span><span style=3D"color: #660;" class=3D=
"styled-by-prettify">>}</span></div></code></div><br>Yes, it's a simple =
thing to fix. But do you honestly want a bunch of auto variable declaration=
s, `std::make_cleanup` calls, and such cluttering up functions?<br><br>We a=
lready have to make a language change (whether directly or indirectly via a=
language-support-library change) to make the failure example actually work=
properly. If we're going to make a language change, let's not mess around =
and do it <i>right</i>.<br><br></div><blockquote class=3D"gmail_quote" styl=
e=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left:=
1ex;">So far I have seen zero reasons to add new language
<br>features, the proposed library additions work just fine with the
<br>existing language
<br>facilities.
<br></blockquote>
<p></p>
-- <br />
<br />
<br />
<br />
------=_Part_575_2803182.1353272815359--
.
Author: Korcan Hussein <korcan.hussein@googlemail.com>
Date: Sun, 18 Nov 2012 17:58:26 -0800 (PST)
Raw View
------=_Part_260_31380588.1353290306967
Content-Type: text/plain; charset=ISO-8859-1
This looks like a really convoluted solution, I think you can achieve more
simple yet better solutions following the with-/backet style higher-order
functions, e.g.:
#include <cstdio>
#include <stdexcept>
template < typename Aquire, typename Release, typename Action >
inline auto bracket(Aquire aquire, Release release, Action action) ->
decltype(action(aquire()))
{
auto val = aquire();
try
{
auto result = action(val);
release(val);
return result;
}
catch (...)
{
release(val);
throw ;
}
}
template < typename Action >
inline auto with_file(const char* filename, const char* mode, Action action)
-> decltype(action(static_cast<FILE*>(nullptr)))
{
return bracket
(
[filename, mode]()
{
if (FILE* fp = std::fopen(filename, mode))
return fp;
else
throw std::runtime_error("Failed to open File.");
},
std::fclose,
action
);
}
int main()
{
return with_file("foo.txt", "r", [](FILE* fp)
{
// ...
return EXIT_SUCCESS;
});
}
--
------=_Part_260_31380588.1353290306967
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
This looks like a really convoluted solution, I think you can achieve=20
more simple yet better solutions following the with-/backet style=20
higher-order functions, e.g.:<br><br><div class=3D"prettyprint" style=3D"ba=
ckground-color: rgb(250, 250, 250); border-color: rgb(187, 187, 187); borde=
r-style: solid; border-width: 1px; word-wrap: break-word;"><code class=3D"p=
rettyprint"><div class=3D"subprettyprint"><span style=3D"color: #800;" clas=
s=3D"styled-by-prettify">#include</span><span style=3D"color: #000;" class=
=3D"styled-by-prettify"> </span><span style=3D"color: #080;" class=3D"style=
d-by-prettify"><cstdio></span><span style=3D"color: #000;" class=3D"s=
tyled-by-prettify"><br></span><span style=3D"color: #800;" class=3D"styled-=
by-prettify">#include</span><span style=3D"color: #000;" class=3D"styled-by=
-prettify"> </span><span style=3D"color: #080;" class=3D"styled-by-prettify=
"><stdexcept></span><span style=3D"color: #000;" class=3D"styled-by-p=
rettify"><br><br></span><span style=3D"color: #008;" class=3D"styled-by-pre=
ttify">template</span><span style=3D"color: #000;" class=3D"styled-by-prett=
ify"> </span><span style=3D"color: #660;" class=3D"styled-by-prettify"><=
</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> </span><s=
pan style=3D"color: #008;" class=3D"styled-by-prettify">typename</span><spa=
n style=3D"color: #000;" class=3D"styled-by-prettify"> </span><span style=
=3D"color: #606;" class=3D"styled-by-prettify">Aquire</span><span style=3D"=
color: #660;" class=3D"styled-by-prettify">,</span><span style=3D"color: #0=
00;" class=3D"styled-by-prettify"> </span><span style=3D"color: #008;" clas=
s=3D"styled-by-prettify">typename</span><span style=3D"color: #000;" class=
=3D"styled-by-prettify"> </span><span style=3D"color: #606;" class=3D"style=
d-by-prettify">Release</span><span style=3D"color: #660;" class=3D"styled-b=
y-prettify">,</span><span style=3D"color: #000;" class=3D"styled-by-prettif=
y"> </span><span style=3D"color: #008;" class=3D"styled-by-prettify">typena=
me</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> </span>=
<span style=3D"color: #606;" class=3D"styled-by-prettify">Action</span><spa=
n style=3D"color: #000;" class=3D"styled-by-prettify"> </span><span style=
=3D"color: #660;" class=3D"styled-by-prettify">></span><span style=3D"co=
lor: #000;" class=3D"styled-by-prettify"><br></span><span style=3D"color: #=
008;" class=3D"styled-by-prettify">inline</span><span style=3D"color: #000;=
" class=3D"styled-by-prettify"> </span><span style=3D"color: #008;" class=
=3D"styled-by-prettify">auto</span><span style=3D"color: #000;" class=3D"st=
yled-by-prettify"> bracket</span><span style=3D"color: #660;" class=3D"styl=
ed-by-prettify">(</span><span style=3D"color: #606;" class=3D"styled-by-pre=
ttify">Aquire</span><span style=3D"color: #000;" class=3D"styled-by-prettif=
y"> aquire</span><span style=3D"color: #660;" class=3D"styled-by-prettify">=
,</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> </span><=
span style=3D"color: #606;" class=3D"styled-by-prettify">Release</span><spa=
n style=3D"color: #000;" class=3D"styled-by-prettify"> release</span><span =
style=3D"color: #660;" class=3D"styled-by-prettify">,</span><span style=3D"=
color: #000;" class=3D"styled-by-prettify"> </span><span style=3D"color: #6=
06;" class=3D"styled-by-prettify">Action</span><span style=3D"color: #000;"=
class=3D"styled-by-prettify"> action</span><span style=3D"color: #660;" cl=
ass=3D"styled-by-prettify">)</span><span style=3D"color: #000;" class=3D"st=
yled-by-prettify"> </span><span style=3D"color: #660;" class=3D"styled-by-p=
rettify">-></span><span style=3D"color: #000;" class=3D"styled-by-pretti=
fy"> </span><span style=3D"color: #008;" class=3D"styled-by-prettify">declt=
ype</span><span style=3D"color: #660;" class=3D"styled-by-prettify">(</span=
><span style=3D"color: #000;" class=3D"styled-by-prettify">action</span><sp=
an style=3D"color: #660;" class=3D"styled-by-prettify">(</span><span style=
=3D"color: #000;" class=3D"styled-by-prettify">aquire</span><span style=3D"=
color: #660;" class=3D"styled-by-prettify">()))</span><span style=3D"color:=
#000;" class=3D"styled-by-prettify"><br></span><span style=3D"color: #660;=
" class=3D"styled-by-prettify">{</span><span style=3D"color: #000;" class=
=3D"styled-by-prettify"><br> </span><span style=3D"color: #008=
;" class=3D"styled-by-prettify">auto</span><span style=3D"color: #000;" cla=
ss=3D"styled-by-prettify"> val </span><span style=3D"color: #660;" class=3D=
"styled-by-prettify">=3D</span><span style=3D"color: #000;" class=3D"styled=
-by-prettify"> aquire</span><span style=3D"color: #660;" class=3D"styled-by=
-prettify">();</span><span style=3D"color: #000;" class=3D"styled-by-pretti=
fy"><br> </span><span style=3D"color: #008;" class=3D"styled-b=
y-prettify">try</span><span style=3D"color: #000;" class=3D"styled-by-prett=
ify"><br> </span><span style=3D"color: #660;" class=3D"styled-=
by-prettify">{</span><span style=3D"color: #000;" class=3D"styled-by-pretti=
fy"><br> </span><span style=3D"color: #008;" cla=
ss=3D"styled-by-prettify">auto</span><span style=3D"color: #000;" class=3D"=
styled-by-prettify"> result </span><span style=3D"color: #660;" class=3D"st=
yled-by-prettify">=3D</span><span style=3D"color: #000;" class=3D"styled-by=
-prettify"> action</span><span style=3D"color: #660;" class=3D"styled-by-pr=
ettify">(</span><span style=3D"color: #000;" class=3D"styled-by-prettify">v=
al</span><span style=3D"color: #660;" class=3D"styled-by-prettify">);</span=
><span style=3D"color: #000;" class=3D"styled-by-prettify"><br>  =
; release</span><span style=3D"color: #660;" class=3D"styled-=
by-prettify">(</span><span style=3D"color: #000;" class=3D"styled-by-pretti=
fy">val</span><span style=3D"color: #660;" class=3D"styled-by-prettify">);<=
/span><span style=3D"color: #000;" class=3D"styled-by-prettify"><br> =
</span><span style=3D"color: #008;" class=3D"styled-by=
-prettify">return</span><span style=3D"color: #000;" class=3D"styled-by-pre=
ttify"> result</span><span style=3D"color: #660;" class=3D"styled-by-pretti=
fy">;</span><span style=3D"color: #000;" class=3D"styled-by-prettify"><br>&=
nbsp; </span><span style=3D"color: #660;" class=3D"styled-by-prettif=
y">}</span><span style=3D"color: #000;" class=3D"styled-by-prettify"><br>&n=
bsp; </span><span style=3D"color: #008;" class=3D"styled-by-prettify=
">catch</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> </=
span><span style=3D"color: #660;" class=3D"styled-by-prettify">(...)</span>=
<span style=3D"color: #000;" class=3D"styled-by-prettify"> <br=
> </span><span style=3D"color: #660;" class=3D"styled-by-prett=
ify">{</span><span style=3D"color: #000;" class=3D"styled-by-prettify"><br>=
release</span><span style=3D"color: #660;" clas=
s=3D"styled-by-prettify">(</span><span style=3D"color: #000;" class=3D"styl=
ed-by-prettify">val</span><span style=3D"color: #660;" class=3D"styled-by-p=
rettify">);</span><span style=3D"color: #000;" class=3D"styled-by-prettify"=
><br> </span><span style=3D"color: #008;" class=
=3D"styled-by-prettify">throw</span><span style=3D"color: #000;" class=3D"s=
tyled-by-prettify"> </span><span style=3D"color: #660;" class=3D"styled-by-=
prettify">;</span><span style=3D"color: #000;" class=3D"styled-by-prettify"=
><br> </span><span style=3D"color: #660;" class=3D"styled-by-p=
rettify">}</span><span style=3D"color: #000;" class=3D"styled-by-prettify">=
<br></span><span style=3D"color: #660;" class=3D"styled-by-prettify">}</spa=
n><span style=3D"color: #000;" class=3D"styled-by-prettify"><br><br></span>=
<span style=3D"color: #008;" class=3D"styled-by-prettify">template</span><s=
pan style=3D"color: #000;" class=3D"styled-by-prettify"> </span><span style=
=3D"color: #660;" class=3D"styled-by-prettify"><</span><span style=3D"co=
lor: #000;" class=3D"styled-by-prettify"> </span><span style=3D"color: #008=
;" class=3D"styled-by-prettify">typename</span><span style=3D"color: #000;"=
class=3D"styled-by-prettify"> </span><span style=3D"color: #606;" class=3D=
"styled-by-prettify">Action</span><span style=3D"color: #000;" class=3D"sty=
led-by-prettify"> </span><span style=3D"color: #660;" class=3D"styled-by-pr=
ettify">></span><span style=3D"color: #000;" class=3D"styled-by-prettify=
"><br></span><span style=3D"color: #008;" class=3D"styled-by-prettify">inli=
ne</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> </span>=
<span style=3D"color: #008;" class=3D"styled-by-prettify">auto</span><span =
style=3D"color: #000;" class=3D"styled-by-prettify"> with_file</span><span =
style=3D"color: #660;" class=3D"styled-by-prettify">(</span><span style=3D"=
color: #008;" class=3D"styled-by-prettify">const</span><span style=3D"color=
: #000;" class=3D"styled-by-prettify"> </span><span style=3D"color: #008;" =
class=3D"styled-by-prettify">char</span><span style=3D"color: #660;" class=
=3D"styled-by-prettify">*</span><span style=3D"color: #000;" class=3D"style=
d-by-prettify"> filename</span><span style=3D"color: #660;" class=3D"styled=
-by-prettify">,</span><span style=3D"color: #000;" class=3D"styled-by-prett=
ify"> </span><span style=3D"color: #008;" class=3D"styled-by-prettify">cons=
t</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> </span><=
span style=3D"color: #008;" class=3D"styled-by-prettify">char</span><span s=
tyle=3D"color: #660;" class=3D"styled-by-prettify">*</span><span style=3D"c=
olor: #000;" class=3D"styled-by-prettify"> mode</span><span style=3D"color:=
#660;" class=3D"styled-by-prettify">,</span><span style=3D"color: #000;" c=
lass=3D"styled-by-prettify"> </span><span style=3D"color: #606;" class=3D"s=
tyled-by-prettify">Action</span><span style=3D"color: #000;" class=3D"style=
d-by-prettify"> action</span><span style=3D"color: #660;" class=3D"styled-b=
y-prettify">)</span><span style=3D"color: #000;" class=3D"styled-by-prettif=
y"> </span><span style=3D"color: #660;" class=3D"styled-by-prettify">-><=
/span><span style=3D"color: #000;" class=3D"styled-by-prettify"> </span><sp=
an style=3D"color: #008;" class=3D"styled-by-prettify">decltype</span><span=
style=3D"color: #660;" class=3D"styled-by-prettify">(</span><span style=3D=
"color: #000;" class=3D"styled-by-prettify">action</span><span style=3D"col=
or: #660;" class=3D"styled-by-prettify">(</span><span style=3D"color: #008;=
" class=3D"styled-by-prettify">static_cast</span><span style=3D"color: #660=
;" class=3D"styled-by-prettify"><</span><span style=3D"color: #000;" cla=
ss=3D"styled-by-prettify">FILE</span><span style=3D"color: #660;" class=3D"=
styled-by-prettify">*>(</span><span style=3D"color: #008;" class=3D"styl=
ed-by-prettify">nullptr</span><span style=3D"color: #660;" class=3D"styled-=
by-prettify">)))</span><span style=3D"color: #000;" class=3D"styled-by-pret=
tify"><br></span><span style=3D"color: #660;" class=3D"styled-by-prettify">=
{</span><span style=3D"color: #000;" class=3D"styled-by-prettify"><br> =
; </span><span style=3D"color: #008;" class=3D"styled-by-prettify">r=
eturn</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> brac=
ket<br> </span><span style=3D"color: #660;" class=3D"styled-by=
-prettify">(</span><span style=3D"color: #000;" class=3D"styled-by-prettify=
"><br> </span><span style=3D"color: #660;" class=
=3D"styled-by-prettify">[</span><span style=3D"color: #000;" class=3D"style=
d-by-prettify">filename</span><span style=3D"color: #660;" class=3D"styled-=
by-prettify">,</span><span style=3D"color: #000;" class=3D"styled-by-pretti=
fy"> mode</span><span style=3D"color: #660;" class=3D"styled-by-prettify">]=
()</span><span style=3D"color: #000;" class=3D"styled-by-prettify"><br>&nbs=
p; </span><span style=3D"color: #660;" class=3D"styled=
-by-prettify">{</span><span style=3D"color: #000;" class=3D"styled-by-prett=
ify"><br> </span><span style=3D"co=
lor: #008;" class=3D"styled-by-prettify">if</span><span style=3D"color: #00=
0;" class=3D"styled-by-prettify"> </span><span style=3D"color: #660;" class=
=3D"styled-by-prettify">(</span><span style=3D"color: #000;" class=3D"style=
d-by-prettify">FILE</span><span style=3D"color: #660;" class=3D"styled-by-p=
rettify">*</span><span style=3D"color: #000;" class=3D"styled-by-prettify">=
fp </span><span style=3D"color: #660;" class=3D"styled-by-prettify">=3D</s=
pan><span style=3D"color: #000;" class=3D"styled-by-prettify"> std</span><s=
pan style=3D"color: #660;" class=3D"styled-by-prettify">::</span><span styl=
e=3D"color: #000;" class=3D"styled-by-prettify">fopen</span><span style=3D"=
color: #660;" class=3D"styled-by-prettify">(</span><span style=3D"color: #0=
00;" class=3D"styled-by-prettify">filename</span><span style=3D"color: #660=
;" class=3D"styled-by-prettify">,</span><span style=3D"color: #000;" class=
=3D"styled-by-prettify"> mode</span><span style=3D"color: #660;" class=3D"s=
tyled-by-prettify">))</span><span style=3D"color: #000;" class=3D"styled-by=
-prettify"><br> </sp=
an><span style=3D"color: #008;" class=3D"styled-by-prettify">return</span><=
span style=3D"color: #000;" class=3D"styled-by-prettify"> fp</span><span st=
yle=3D"color: #660;" class=3D"styled-by-prettify">;</span><span style=3D"co=
lor: #000;" class=3D"styled-by-prettify"><br> &n=
bsp; </span><span style=3D"color: #008;" class=3D"styled-by-prettify=
">else</span><span style=3D"color: #000;" class=3D"styled-by-prettify"><br>=
</span><span style=
=3D"color: #008;" class=3D"styled-by-prettify">throw</span><span style=3D"c=
olor: #000;" class=3D"styled-by-prettify"> std</span><span style=3D"color: =
#660;" class=3D"styled-by-prettify">::</span><span style=3D"color: #000;" c=
lass=3D"styled-by-prettify">runtime_error</span><span style=3D"color: #660;=
" class=3D"styled-by-prettify">(</span><span style=3D"color: #080;" class=
=3D"styled-by-prettify">"Failed to open File."</span><span style=3D"color: =
#660;" class=3D"styled-by-prettify">);</span><span style=3D"color: #000;" c=
lass=3D"styled-by-prettify"><br> </span><span st=
yle=3D"color: #660;" class=3D"styled-by-prettify">},</span><span style=3D"c=
olor: #000;" class=3D"styled-by-prettify"><br> s=
td</span><span style=3D"color: #660;" class=3D"styled-by-prettify">::</span=
><span style=3D"color: #000;" class=3D"styled-by-prettify">fclose</span><sp=
an style=3D"color: #660;" class=3D"styled-by-prettify">,</span><span style=
=3D"color: #000;" class=3D"styled-by-prettify"><br> &nb=
sp; action<br> </span><span style=3D"color: #660;" class=3D"st=
yled-by-prettify">);</span><span style=3D"color: #000;" class=3D"styled-by-=
prettify"><br></span><span style=3D"color: #660;" class=3D"styled-by-pretti=
fy">}</span><span style=3D"color: #000;" class=3D"styled-by-prettify"><br><=
br></span><span style=3D"color: #008;" class=3D"styled-by-prettify">int</sp=
an><span style=3D"color: #000;" class=3D"styled-by-prettify"> main</span><s=
pan style=3D"color: #660;" class=3D"styled-by-prettify">()</span><span styl=
e=3D"color: #000;" class=3D"styled-by-prettify"><br></span><span style=3D"c=
olor: #660;" class=3D"styled-by-prettify">{</span><span style=3D"color: #00=
0;" class=3D"styled-by-prettify"><br> </span><span style=3D"co=
lor: #008;" class=3D"styled-by-prettify">return</span><span style=3D"color:=
#000;" class=3D"styled-by-prettify"> with_file</span><span style=3D"color:=
#660;" class=3D"styled-by-prettify">(</span><span style=3D"color: #080;" c=
lass=3D"styled-by-prettify">"foo.txt"</span><span style=3D"color: #660;" cl=
ass=3D"styled-by-prettify">,</span><span style=3D"color: #000;" class=3D"st=
yled-by-prettify"> </span><span style=3D"color: #080;" class=3D"styled-by-p=
rettify">"r"</span><span style=3D"color: #660;" class=3D"styled-by-prettify=
">,</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> </span=
><span style=3D"color: #660;" class=3D"styled-by-prettify">[](</span><span =
style=3D"color: #000;" class=3D"styled-by-prettify">FILE</span><span style=
=3D"color: #660;" class=3D"styled-by-prettify">*</span><span style=3D"color=
: #000;" class=3D"styled-by-prettify"> fp</span><span style=3D"color: #660;=
" class=3D"styled-by-prettify">)</span><span style=3D"color: #000;" class=
=3D"styled-by-prettify"><br> </span><span style=3D"color: #660=
;" class=3D"styled-by-prettify">{</span><span style=3D"color: #000;" class=
=3D"styled-by-prettify"><br> </span><span style=
=3D"color: #800;" class=3D"styled-by-prettify">// ...</span><span style=3D"=
color: #000;" class=3D"styled-by-prettify"><br> =
</span><span style=3D"color: #008;" class=3D"styled-by-prettify">return</sp=
an><span style=3D"color: #000;" class=3D"styled-by-prettify"> EXIT_SUCCESS<=
/span><span style=3D"color: #660;" class=3D"styled-by-prettify">;</span><sp=
an style=3D"color: #000;" class=3D"styled-by-prettify"><br> </=
span><span style=3D"color: #660;" class=3D"styled-by-prettify">});</span><s=
pan style=3D"color: #000;" class=3D"styled-by-prettify"><br></span><span st=
yle=3D"color: #660;" class=3D"styled-by-prettify">}</span></div></code></di=
v><br>
<p></p>
-- <br />
<br />
<br />
<br />
------=_Part_260_31380588.1353290306967--
.
Author: Jens Maurer <Jens.Maurer@gmx.net>
Date: Mon, 19 Nov 2012 08:55:42 +0100
Raw View
Trivia note:
The "acquire" word needs to get a "c" in your code.
http://www.merriam-webster.com/dictionary/acquire
Jens
On 11/19/2012 02:58 AM, Korcan Hussein wrote:
> This looks like a really convoluted solution, I think you can achieve more simple yet better solutions following the with-/backet style higher-order functions, e.g.:
>
> ||
> #include<cstdio>
> #include<stdexcept>
>
> template<typenameAquire,typenameRelease,typenameAction>
> inlineautobracket(Aquireaquire,Releaserelease,Actionaction)->decltype(action(aquire()))
--
.
Author: Jens Maurer <Jens.Maurer@gmx.net>
Date: Mon, 19 Nov 2012 09:00:48 +0100
Raw View
On 11/18/2012 09:37 PM, grigorij1981@gmail.com wrote:
> By the way, recently on boost mailing list Evgeny Panasyk proposed as additions to BOOST_SCOPE_EXIT scope_failure and scope_success macros.
>
> http://boost.2283326.n4.nabble.com/scope-exit-D-style-scope-failure-and-scope-success-in-C-td4636441.html
I like the "destructor with bool parameter" approach a lot, instead of
another global state query function. This seems to be a small, but
(for the corner cases we're discussing here) useful core extension.
Jens
--
.
Author: Jens Maurer <Jens.Maurer@gmx.net>
Date: Mon, 19 Nov 2012 09:14:02 +0100
Raw View
On 11/18/2012 10:06 PM, Nicol Bolas wrote:
> We already have to make a language change (whether directly or
> indirectly via a language-support-library change) to make the failure
> example actually work properly. If we're going to make a language
> change, let's not mess around and do it /right/.
For some cases, I want the failure cleanup code to be away from the
user's eyes, and attached to some "initialization" action.
Example from hypothetical database connection library:
{
dbtransaction t(connection); // executes "begin transaction"
connection.execute("UPDATE...");
connection.execute("INSERT..."); // might throw "duplicate primary key"
} // commit-by-default at end of scope
It would be cool if "dbtransaction" could do a "commit" for the normal
case and a "rollback" for the exception case. As I've just learned,
asking std::uncaught_exception() doesn't cover the corner case when
the block above appears in a destructor invoked by unrelated stack
unwinding.
I want this code nicely wrapped inside "dbtransaction" and don't want to
force my users to repeatedly spell out rollback/commit.
Jens
--
.
Author: =?ISO-8859-1?Q?Mikael_Kilpel=E4inen?=
Date: Mon, 19 Nov 2012 10:03:13 +0100
Raw View
>> We already have to make a language change (whether directly or
>> indirectly via a language-support-library change) to make the failure
>> example actually work properly. If we're going to make a language
>> change, let's not mess around and do it /right/.
> For some cases, I want the failure cleanup code to be away from the
> user's eyes, and attached to some "initialization" action.
> Example from hypothetical database connection library:
>
> {
> dbtransaction t(connection); // executes "begin transaction"
> connection.execute("UPDATE...");
> connection.execute("INSERT..."); // might throw "duplicate primary key"
> } // commit-by-default at end of scope
>
> It would be cool if "dbtransaction" could do a "commit" for the normal
> case and a "rollback" for the exception case. As I've just learned,
> asking std::uncaught_exception() doesn't cover the corner case when
> the block above appears in a destructor invoked by unrelated stack
> unwinding.
This is certainly what I would have wanted when implementing database
library.
However we are getting pretty far from the original proposal that was
simple generic handle which
acts along the line of unique_ptr (ie. no core change needed).
> I want this code nicely wrapped inside "dbtransaction" and don't want to
> force my users to repeatedly spell out rollback/commit.
Not to mention the hard-to-find bugs this produces when you fail to do so.
Mikael
--
.
Author: Andrew Sandoval <sandoval@netwaysglobal.com>
Date: Mon, 19 Nov 2012 07:01:33 -0800 (PST)
Raw View
------=_Part_49_26404295.1353337293338
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
On Monday, November 19, 2012 3:03:29 AM UTC-6, Mikael Kilpel=E4inen wrote:
>
> >> We already have to make a language change (whether directly or=20
> >> indirectly via a language-support-library change) to make the failure=
=20
> >> example actually work properly. If we're going to make a language=20
> >> change, let's not mess around and do it /right/.=20
> > For some cases, I want the failure cleanup code to be away from the=20
> > user's eyes, and attached to some "initialization" action.=20
> > Example from hypothetical database connection library:=20
> >=20
> > {=20
> > dbtransaction t(connection); // executes "begin transaction"=20
> > connection.execute("UPDATE...");=20
> > connection.execute("INSERT..."); // might throw "duplicate primar=
y=20
> key"=20
> > } // commit-by-default at end of scope=20
> >=20
> > It would be cool if "dbtransaction" could do a "commit" for the normal=
=20
> > case and a "rollback" for the exception case. As I've just learned,=20
> > asking std::uncaught_exception() doesn't cover the corner case when=20
> > the block above appears in a destructor invoked by unrelated stack=20
> > unwinding.=20
> This is certainly what I would have wanted when implementing database=20
> library.=20
> However we are getting pretty far from the original proposal that was=20
> simple generic handle which=20
> acts along the line of unique_ptr (ie. no core change needed).=20
>
> > I want this code nicely wrapped inside "dbtransaction" and don't want t=
o=20
> > force my users to repeatedly spell out rollback/commit.=20
> Not to mention the hard-to-find bugs this produces when you fail to do so=
..=20
>
> Mikael=20
>
Thank you Mikael. I agree. My interest is in getting something useful=20
added to the Standard Library in the short term, that will improve C++ code=
=20
now (relatively speaking), without a core language change. Everyone who=20
wants the D like features is welcome to propose those, but let it be=20
separate. A core language change isn't going to be usable by most=20
compilers for many years, where an isolated Standard Library addition could=
=20
be available much sooner.
Thanks,
Andrew Sandoval
--=20
------=_Part_49_26404295.1353337293338
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
On Monday, November 19, 2012 3:03:29 AM UTC-6, Mikael Kilpel=E4inen wrote:<=
blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;bord=
er-left: 1px #ccc solid;padding-left: 1ex;">>> We already have to mak=
e a language change (whether directly or
<br>>> indirectly via a language-support-library change) to make the =
failure
<br>>> example actually work properly. If we're going to make a langu=
age
<br>>> change, let's not mess around and do it /right/.
<br>> For some cases, I want the failure cleanup code to be away from th=
e
<br>> user's eyes, and attached to some "initialization" action.
<br>> Example from hypothetical database connection library:
<br>>
<br>> {
<br>> dbtransaction t(connection); // execute=
s "begin transaction"
<br>> connection.execute("UPDATE...<wbr>");
<br>> connection.execute("INSERT...<wbr>"); //=
might throw "duplicate primary key"
<br>> } // commit-by-default at end of scope
<br>>
<br>> It would be cool if "dbtransaction" could do a "commit" for the no=
rmal
<br>> case and a "rollback" for the exception case. As I've just l=
earned,
<br>> asking std::uncaught_exception() doesn't cover the corner case whe=
n
<br>> the block above appears in a destructor invoked by unrelated stack
<br>> unwinding.
<br>This is certainly what I would have wanted when implementing database=
=20
<br>library.
<br>However we are getting pretty far from the original proposal that was=
=20
<br>simple generic handle which
<br>acts along the line of unique_ptr (ie. no core change needed).
<br>
<br>> I want this code nicely wrapped inside "dbtransaction" and don't w=
ant to
<br>> force my users to repeatedly spell out rollback/commit.
<br>Not to mention the hard-to-find bugs this produces when you fail to do =
so.
<br>
<br>Mikael
<br></blockquote><div><br>Thank you Mikael. I agree. My interes=
t is in getting something useful added to the Standard Library in the short=
term, that will improve C++ code now (relatively speaking), without a core=
language change. Everyone who wants the D like features is welcome t=
o propose those, but let it be separate. A core language change isn't=
going to be usable by most compilers for many years, where an isolated Sta=
ndard Library addition could be available much sooner.<br><br>Thanks,<br>An=
drew Sandoval<br></div>
<p></p>
-- <br />
<br />
<br />
<br />
------=_Part_49_26404295.1353337293338--
.
Author: Andrew Sandoval <sandoval@netwaysglobal.com>
Date: Mon, 19 Nov 2012 08:58:44 -0800 (PST)
Raw View
------=_Part_34_4417239.1353344324548
Content-Type: text/plain; charset=ISO-8859-1
On Sunday, November 18, 2012 11:52:41 AM UTC-6, Ville Voutilainen wrote:
>
> ...
> Of these, I expect scoped_resource to be the "default", since it's the
> most capable and most generic.
> I have trouble with the name unique_resource, because I don't see it
> being similar to unique_ptr and
> unique_lock in the sense that those are move-only resource handles.
> The most important facility
> of unique_resource isn't uniqueness, but rather that it's a
> space-optimized variant of scoped_resource,
> and doesn't allow the same breadth of possible deleter types.
>
> How about auto_resource instead of unique_resource? Does auto_* have too
much negativity associated with it since auto_ptr?
Thanks,
Andrew Sandoval
--
------=_Part_34_4417239.1353344324548
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
On Sunday, November 18, 2012 11:52:41 AM UTC-6, Ville Voutilainen wrote:<bl=
ockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border=
-left: 1px #ccc solid;padding-left: 1ex;">...<br>Of these, I expect scoped_=
resource to be the "default", since it's the
<br>most capable and most generic.
<br>I have trouble with the name unique_resource, because I don't see it
<br>being similar to unique_ptr and
<br>unique_lock in the sense that those are move-only resource handles.
<br>The most important facility
<br>of unique_resource isn't uniqueness, but rather that it's a
<br>space-optimized variant of scoped_resource,
<br>and doesn't allow the same breadth of possible deleter types.
<br>
<br></blockquote><div>How about<span style=3D"font-family: courier new,mono=
space;"> auto_resource</span> instead of <span style=3D"font-family: courie=
r new,monospace;">unique_resource</span>? Does auto_* have too much n=
egativity associated with it since<span style=3D"font-family: courier new,m=
onospace;"> auto_ptr</span>?<br>Thanks,<br>Andrew Sandoval<br> <br></d=
iv>
<p></p>
-- <br />
<br />
<br />
<br />
------=_Part_34_4417239.1353344324548--
.
Author: Ville Voutilainen <ville.voutilainen@gmail.com>
Date: Mon, 19 Nov 2012 19:34:04 +0200
Raw View
On 19 November 2012 18:58, Andrew Sandoval <sandoval@netwaysglobal.com> wrote:
> How about auto_resource instead of unique_resource? Does auto_* have too
> much negativity associated with it since auto_ptr?
Well, that resource wrapper is no more or less automatic than the
scoped_resource is,
as it's no more or less unique. I'm not trying to be difficult here,
I'm just trying to find
a name that describes it. It seems very much like scoped_resource, it just takes
the deleter as a type argument and doesn't require storage for it. Is
it just a specialization
of scoped_resource for function pointers? That's probably not quite
doable because
the parameter list of a specialization needs to match its generic
counterpart. I find it
hard to name this wrapper well. scoped_resource_packed? (grasping at
straws here...)
--
.
Author: Jeffrey Yasskin <jyasskin@googlers.com>
Date: Mon, 19 Nov 2012 09:44:42 -0800
Raw View
On Mon, Nov 19, 2012 at 9:34 AM, Ville Voutilainen
<ville.voutilainen@gmail.com> wrote:
> On 19 November 2012 18:58, Andrew Sandoval <sandoval@netwaysglobal.com> wrote:
>> How about auto_resource instead of unique_resource? Does auto_* have too
>> much negativity associated with it since auto_ptr?
>
> Well, that resource wrapper is no more or less automatic than the
> scoped_resource is,
> as it's no more or less unique. I'm not trying to be difficult here,
> I'm just trying to find
> a name that describes it. It seems very much like scoped_resource, it just takes
> the deleter as a type argument and doesn't require storage for it. Is
> it just a specialization
> of scoped_resource for function pointers? That's probably not quite
> doable because
> the parameter list of a specialization needs to match its generic
> counterpart. I find it
> hard to name this wrapper well. scoped_resource_packed? (grasping at
> straws here...)
With locks, we have unique_lock that holds storage for "do I own the
lock", and lock_guard that doesn't. So maybe resource_guard? (I
haven't read the whole proposal or thread, so sorry if that makes no
sense.)
--
.
Author: Tony V E <tvaneerd@gmail.com>
Date: Mon, 19 Nov 2012 18:30:24
Raw View
--001636d33d2a97d43404cedd4ff8
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
I think whoever makes the proposal decides whatever they want since they
are the ones doing the work, but comparing it to a language change (or
failing to do so) might affect how people vote on it.
Tony
*From: *Andrew Sandoval
*Sent: *Monday, November 19, 2012 10:01:35 AM EDT
*To: *std-proposals@isocpp.org
*Reply To: *std-proposals@isocpp.org
*Subject: *Re: [std-proposals] Re: Proposal: Generic RAII library...
On Monday, November 19, 2012 3:03:29 AM UTC-6, Mikael Kilpel=E4inen wrote:
>
> >> We already have to make a language change (whether directly or
> >> indirectly via a language-support-library change) to make the failure
> >> example actually work properly. If we're going to make a language
> >> change, let's not mess around and do it /right/.
> > For some cases, I want the failure cleanup code to be away from the
> > user's eyes, and attached to some "initialization" action.
> > Example from hypothetical database connection library:
> >
> > {
> > dbtransaction t(connection); // executes "begin transaction"
> > connection.execute("UPDATE...");
> > connection.execute("INSERT..."); // might throw "duplicate primar=
y
> key"
> > } // commit-by-default at end of scope
> >
> > It would be cool if "dbtransaction" could do a "commit" for the normal
> > case and a "rollback" for the exception case. As I've just learned,
> > asking std::uncaught_exception() doesn't cover the corner case when
> > the block above appears in a destructor invoked by unrelated stack
> > unwinding.
> This is certainly what I would have wanted when implementing database
> library.
> However we are getting pretty far from the original proposal that was
> simple generic handle which
> acts along the line of unique_ptr (ie. no core change needed).
>
> > I want this code nicely wrapped inside "dbtransaction" and don't want t=
o
> > force my users to repeatedly spell out rollback/commit.
> Not to mention the hard-to-find bugs this produces when you fail to do so=
..
>
> Mikael
>
Thank you Mikael. I agree. My interest is in getting something useful
added to the Standard Library in the short term, that will improve C++ code
now (relatively speaking), without a core language change. Everyone who
wants the D like features is welcome to propose those, but let it be
separate. A core language change isn't going to be usable by most
compilers for many years, where an isolated Standard Library addition could
be available much sooner.
Thanks,
Andrew Sandoval
--
--=20
--001636d33d2a97d43404cedd4ff8
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
<head></head><body style=3D"background-color:rgb(255,255,255)" dir=3D"LTR">=
<div id=3D"BB10_response_div" style=3D"width:100%;background:#ffffff;font-f=
amily:"Slate Pro","Calibri","sans-serif";colo=
r:#1f497d">
I think whoever makes the proposal decides whatever they want since they ar=
e the ones doing the work, but comparing it to a language change (or failin=
g to do so) might affect how people vote on it.<br><br></div><div id=3D"BB1=
0_response_div" style=3D"width:100%;background:#ffffff;font-family:"Sl=
ate Pro","Calibri","sans-serif";color:#1f497d">
Tony</div><p id=3D"_signaturePlaceholder" style=3D"font-family:"Slate =
Pro","Calibri","sans-serif";color:#1f497d"></p><ta=
ble id=3D"_bb10TempSeparator" width=3D"100%" style=3D"border-spacing:0px"><=
tbody><tr>
<td colspan=3D"2"><div id=3D"_persistentSeparator" style=3D"border-style:so=
lid none none;border-top-color:rgb(181,196,223);border-top-width:1pt;paddin=
g:3pt 0in 0in;font-family:Tahoma,'BB Alpha Sans','Slate Pro'=
;;font-size:10pt">
<span><b>From: </b>Andrew Sandoval</span><br><span><b>Sent: </b>Monday, Nov=
ember 19, 2012 10:01:35 AM EDT</span><br><span><b>To: </b><a href=3D"mailto=
:std-proposals@isocpp.org">std-proposals@isocpp.org</a></span><br><span><b>=
Reply To: </b><a href=3D"mailto:std-proposals@isocpp.org">std-proposals@iso=
cpp.org</a></span><br>
<span><b>Subject: </b>Re: [std-proposals] Re: Proposal: Generic RAII librar=
y...</span><br></div></td></tr></tbody></table><div style=3D"border:none;bo=
rder-top:solid #babcd1 1pt"></div><br><div id=3D"_originalContent" style>On=
Monday, November 19, 2012 3:03:29 AM UTC-6, Mikael Kilpel=E4inen wrote:<bl=
ockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-l=
eft:1px #ccc solid;padding-left:1ex">
>> We already have to make a language change (whether directly or
<br>>> indirectly via a language-support-library change) to make the =
failure
<br>>> example actually work properly. If we're going to make a l=
anguage
<br>>> change, let's not mess around and do it /right/.
<br>> For some cases, I want the failure cleanup code to be away from th=
e
<br>> user's eyes, and attached to some "initialization" a=
ction.
<br>> Example from hypothetical database connection library:
<br>>
<br>> =A0 =A0{
<br>> =A0 =A0 =A0dbtransaction t(connection); =A0 // executes "begi=
n transaction"
<br>> =A0 =A0 =A0connection.execute("UPDATE...");
<br>> =A0 =A0 =A0connection.execute("INSERT..."); =A0// might =
throw "duplicate primary key"
<br>> =A0 =A0} =A0// commit-by-default at end of scope
<br>>
<br>> It would be cool if "dbtransaction" could do a "com=
mit" for the normal
<br>> case and a "rollback" for the exception case. =A0As I=
9;ve just learned,
<br>> asking std::uncaught_exception() doesn't cover the corner case=
when
<br>> the block above appears in a destructor invoked by unrelated stack
<br>> unwinding.
<br>This is certainly what I would have wanted when implementing database=
=20
<br>library.
<br>However we are getting pretty far from the original proposal that was=
=20
<br>simple generic handle which
<br>acts along the line of unique_ptr (ie. no core change needed).
<br>
<br>> I want this code nicely wrapped inside "dbtransaction" a=
nd don't want to
<br>> force my users to repeatedly spell out rollback/commit.
<br>Not to mention the hard-to-find bugs this produces when you fail to do =
so.
<br>
<br>Mikael
<br></blockquote><div><br>Thank you Mikael.=A0 I agree.=A0 My interest is i=
n getting something useful added to the Standard Library in the short term,=
that will improve C++ code now (relatively speaking), without a core langu=
age change.=A0 Everyone who wants the D like features is welcome to propose=
those, but let it be separate.=A0 A core language change isn't going t=
o be usable by most compilers for many years, where an isolated Standard Li=
brary addition could be available much sooner.<br>
<br>Thanks,<br>Andrew Sandoval<br></div>
<p></p>
-- <br>
=A0<br>
=A0<br>
=A0<br>
<br></div> </body>
<p></p>
-- <br />
<br />
<br />
<br />
--001636d33d2a97d43404cedd4ff8--
.
Author: Andrew Sandoval <sandoval@netwaysglobal.com>
Date: Mon, 19 Nov 2012 13:02:47 -0800 (PST)
Raw View
------=_Part_59_13807451.1353358967929
Content-Type: text/plain; charset=ISO-8859-1
On Monday, November 19, 2012 11:45:05 AM UTC-6, Jeffrey Yasskin wrote:
>
> On Mon, Nov 19, 2012 at 9:34 AM, Ville Voutilainen
> <ville.vo...@gmail.com <javascript:>> wrote:
> > On 19 November 2012 18:58, Andrew Sandoval <sand...@netwaysglobal.com<javascript:>>
> wrote:
> >> How about auto_resource instead of unique_resource? Does auto_* have
> too
> >> much negativity associated with it since auto_ptr?
> >
> > Well, that resource wrapper is no more or less automatic than the
> > scoped_resource is,
> > as it's no more or less unique. I'm not trying to be difficult here,
> > I'm just trying to find
> > a name that describes it. It seems very much like scoped_resource, it
> just takes
> > the deleter as a type argument and doesn't require storage for it. Is
> > it just a specialization
> > of scoped_resource for function pointers? That's probably not quite
> > doable because
> > the parameter list of a specialization needs to match its generic
> > counterpart. I find it
> > hard to name this wrapper well. scoped_resource_packed? (grasping at
> > straws here...)
>
> With locks, we have unique_lock that holds storage for "do I own the
> lock", and lock_guard that doesn't. So maybe resource_guard? (I
> haven't read the whole proposal or thread, so sorry if that makes no
> sense.)
>
I can definitely live with resource_guard. It is nice and short. Thoughts?
Thanks,
Andrew Sandoval
--
------=_Part_59_13807451.1353358967929
Content-Type: text/html; charset=ISO-8859-1
On Monday, November 19, 2012 11:45:05 AM UTC-6, Jeffrey Yasskin wrote:<blockquote class="gmail_quote" style="margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;">On Mon, Nov 19, 2012 at 9:34 AM, Ville Voutilainen
<br><<a href="javascript:" target="_blank" gdf-obfuscated-mailto="sVyPPrUNPWwJ">ville.vo...@gmail.com</a>> wrote:
<br>> On 19 November 2012 18:58, Andrew Sandoval <<a href="javascript:" target="_blank" gdf-obfuscated-mailto="sVyPPrUNPWwJ">sand...@netwaysglobal.com</a>> wrote:
<br>>> How about auto_resource instead of unique_resource? Does auto_* have too
<br>>> much negativity associated with it since auto_ptr?
<br>>
<br>> Well, that resource wrapper is no more or less automatic than the
<br>> scoped_resource is,
<br>> as it's no more or less unique. I'm not trying to be difficult here,
<br>> I'm just trying to find
<br>> a name that describes it. It seems very much like scoped_resource, it just takes
<br>> the deleter as a type argument and doesn't require storage for it. Is
<br>> it just a specialization
<br>> of scoped_resource for function pointers? That's probably not quite
<br>> doable because
<br>> the parameter list of a specialization needs to match its generic
<br>> counterpart. I find it
<br>> hard to name this wrapper well. scoped_resource_packed? (grasping at
<br>> straws here...)
<br>
<br>With locks, we have unique_lock that holds storage for "do I own the
<br>lock", and lock_guard that doesn't. So maybe resource_guard? (I
<br>haven't read the whole proposal or thread, so sorry if that makes no
<br>sense.)
<br></blockquote><div><br>I can definitely live with <span style="font-family: courier new,monospace;">resource_guard</span>. It is nice and short. Thoughts?<br>Thanks,<br>Andrew Sandoval <br></div>
<p></p>
-- <br />
<br />
<br />
<br />
------=_Part_59_13807451.1353358967929--
.
Author: =?ISO-8859-1?Q?Daniel_Kr=FCgler?= <daniel.kruegler@gmail.com>
Date: Mon, 19 Nov 2012 22:10:33 +0100
Raw View
--047d7bacbff04ed58d04cedf8ca1
Content-Type: text/plain; charset=ISO-8859-1
2012/11/19 Andrew Sandoval <sandoval@netwaysglobal.com>
> On Monday, November 19, 2012 11:45:05 AM UTC-6, Jeffrey Yasskin wrote:
>
>> On Mon, Nov 19, 2012 at 9:34 AM, Ville Voutilainen
>> <ville.vo...@gmail.com> wrote:
>> > On 19 November 2012 18:58, Andrew Sandoval <sand...@netwaysglobal.com>
>> wrote:
>> >> How about auto_resource instead of unique_resource? Does auto_* have
>> too
>> >> much negativity associated with it since auto_ptr?
>> >
>> > Well, that resource wrapper is no more or less automatic than the
>> > scoped_resource is,
>> > as it's no more or less unique. I'm not trying to be difficult here,
>> > I'm just trying to find
>> > a name that describes it. It seems very much like scoped_resource, it
>> just takes
>> > the deleter as a type argument and doesn't require storage for it. Is
>> > it just a specialization
>> > of scoped_resource for function pointers? That's probably not quite
>> > doable because
>> > the parameter list of a specialization needs to match its generic
>> > counterpart. I find it
>> > hard to name this wrapper well. scoped_resource_packed? (grasping at
>> > straws here...)
>>
>> With locks, we have unique_lock that holds storage for "do I own the
>> lock", and lock_guard that doesn't. So maybe resource_guard? (I
>> haven't read the whole proposal or thread, so sorry if that makes no
>> sense.)
>>
>
> I can definitely live with resource_guard. It is nice and short.
> Thoughts?
>
Just take it - really! To my knowledge it has not yet happened that a
proposal
has been rejected because of unhappiness in regard to naming choices.
If you have several naming ideas, just present them in the paper and pick
one.
Whether the committee likes this particular name or not does not really
matter
at the point of an initial proposal. They will tell you (if you can be
present in person)
or your "proxy" (someone who is willing to present your paper to the
committee),
so it will go a second round. This is just the normal iterative process.
- Daniel
--
--047d7bacbff04ed58d04cedf8ca1
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
<div class=3D"gmail_quote">2012/11/19 Andrew Sandoval <span dir=3D"ltr"><=
;<a href=3D"mailto:sandoval@netwaysglobal.com" target=3D"_blank">sandoval@n=
etwaysglobal.com</a>></span><br><blockquote class=3D"gmail_quote" style=
=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class=3D"im">On Monday, November 19, 2012 11:45:05 AM UTC-6, Jeffrey Y=
asskin wrote:</div><blockquote class=3D"gmail_quote" style=3D"margin:0;marg=
in-left:0.8ex;border-left:1px #ccc solid;padding-left:1ex"><div class=3D"im=
">On Mon, Nov 19, 2012 at 9:34 AM, Ville Voutilainen
<br></div><<a>ville.vo...@gmail.com</a>> wrote:
<br><div class=3D"im">> On 19 November 2012 18:58, Andrew Sandoval <<=
a>sand...@netwaysglobal.com</a>> wrote:
<br>>> How about auto_resource instead of unique_resource? =A0Does au=
to_* have too
<br>>> much negativity associated with it since auto_ptr?
<br>>
<br>> Well, that resource wrapper is no more or less automatic than the
<br>> scoped_resource is,
<br>> as it's no more or less unique. I'm not trying to be diffi=
cult here,
<br>> I'm just trying to find
<br>> a name that describes it. It seems very much like scoped_resource,=
it just takes
<br>> the deleter as a type argument and doesn't require storage for=
it. Is
<br>> it just a specialization
<br>> of scoped_resource for function pointers? That's probably not =
quite
<br>> doable because
<br>> the parameter list of a specialization needs to match its generic
<br>> counterpart. I find it
<br>> hard to name this wrapper well. scoped_resource_packed? (grasping =
at
<br>> straws here...)
<br>
<br>With locks, we have unique_lock that holds storage for "do I own t=
he
<br>lock", and lock_guard that doesn't. So maybe resource_guard? (=
I
<br>haven't read the whole proposal or thread, so sorry if that makes n=
o
<br>sense.)
<br></div></blockquote><div><br>I can definitely live with <span style=3D"f=
ont-family:courier new,monospace">resource_guard</span>.=A0 It is nice and =
short.=A0 Thoughts?<span class=3D"HOEnZb"><font color=3D"#888888"><br></fon=
t></span></div>
</blockquote><div><br>Just take it - really! To my knowledge it has not yet=
happened that a proposal<br>has been rejected because of unhappiness in re=
gard to naming choices.<br><br>If you have several naming ideas, just prese=
nt them in the paper and pick one.<br>
<br>Whether the committee likes this particular name or not does not really=
matter<br>at the point of an initial proposal. They will tell you (if you =
can be present in person)<br>or your "proxy" (someone who is will=
ing to present your paper to the committee),<br>
so it will go a second round. This is just the normal iterative process.<br=
><br>- Daniel<br><br><br><br></div></div><br>
<p></p>
-- <br />
<br />
<br />
<br />
--047d7bacbff04ed58d04cedf8ca1--
.
Author: Ville Voutilainen <ville.voutilainen@gmail.com>
Date: Mon, 19 Nov 2012 23:10:58 +0200
Raw View
On 19 November 2012 23:02, Andrew Sandoval <sandoval@netwaysglobal.com> wrote:
>> With locks, we have unique_lock that holds storage for "do I own the
>> lock", and lock_guard that doesn't. So maybe resource_guard? (I
>> haven't read the whole proposal or thread, so sorry if that makes no
>> sense.)
> I can definitely live with resource_guard. It is nice and short. Thoughts?
I think the answer should lie somewhere beneath the question "what's the
real difference between scoped_resource and the proposed unique_resource?".
Both of them contain the resource, so I'm not sure whether the
unique_lock/lock_guard
thinking applies.
--
.
Author: Ville Voutilainen <ville.voutilainen@gmail.com>
Date: Mon, 19 Nov 2012 23:12:33 +0200
Raw View
On 19 November 2012 23:10, Daniel Kr=FCgler <daniel.kruegler@gmail.com> wro=
te:
>> I can definitely live with resource_guard. It is nice and short.
>> Thoughts?
> Just take it - really! To my knowledge it has not yet happened that a
> proposal
> has been rejected because of unhappiness in regard to naming choices.
> If you have several naming ideas, just present them in the paper and pick
> one.
> Whether the committee likes this particular name or not does not really
> matter
> at the point of an initial proposal. They will tell you (if you can be
> present in person)
> or your "proxy" (someone who is willing to present your paper to the
> committee),
> so it will go a second round. This is just the normal iterative process.
Well, my big mouth lead me to be that proxy for optional. Chances are
that the same will happen here. I'd prefer the proposal to be as ready
as possible, if that contingency ends up materializing. :D
--=20
.
Author: =?ISO-8859-1?Q?Mikael_Kilpel=E4inen?=
Date: Mon, 19 Nov 2012 22:36:10 +0100
Raw View
>> Just take it - really! To my knowledge it has not yet happened that a
>> proposal
>> has been rejected because of unhappiness in regard to naming choices.
>> If you have several naming ideas, just present them in the paper and pick
>> one.
>> Whether the committee likes this particular name or not does not really
>> matter
>> at the point of an initial proposal. They will tell you (if you can be
>> present in person)
>> or your "proxy" (someone who is willing to present your paper to the
>> committee),
>> so it will go a second round. This is just the normal iterative process.
> Well, my big mouth lead me to be that proxy for optional. Chances are
> that the same will happen here. I'd prefer the proposal to be as ready
> as possible, if that contingency ends up materializing. :D
>
Well.. Just let me know if I can be of any help...
Mikael
--
.
Author: Ville Voutilainen <ville.voutilainen@gmail.com>
Date: Mon, 19 Nov 2012 23:46:15 +0200
Raw View
On 19 November 2012 23:36, Mikael Kilpel=E4inen
<mikael.kilpelainen@gmail.com> wrote:
>> Well, my big mouth lead me to be that proxy for optional. Chances are
>> that the same will happen here. I'd prefer the proposal to be as ready
>> as possible, if that contingency ends up materializing. :D
> Well.. Just let me know if I can be of any help...
Sure. Championing any proposal requires attending a meeting, so feel free t=
o
join the delegation. ;)
--=20
.
Author: Andrew Sandoval <sandoval@netwaysglobal.com>
Date: Mon, 19 Nov 2012 13:51:17 -0800 (PST)
Raw View
------=_Part_317_1524177.1353361877143
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
On Monday, November 19, 2012 3:46:16 PM UTC-6, Ville Voutilainen wrote:
>
> On 19 November 2012 23:36, Mikael Kilpel=E4inen=20
> <mikael.ki...@gmail.com <javascript:>> wrote:=20
> >> Well, my big mouth lead me to be that proxy for optional. Chances are=
=20
> >> that the same will happen here. I'd prefer the proposal to be as ready=
=20
> >> as possible, if that contingency ends up materializing. :D=20
> > Well.. Just let me know if I can be of any help...=20
>
> Sure. Championing any proposal requires attending a meeting, so feel free=
=20
> to=20
> join the delegation. ;)=20
>
=20
FWIW, if I am able I will go. And, I'm grateful for the interest and help=
=20
everyone is offering. I really think this will be a good thing!
I appreciate the different ideas on a name. The are all better than the=20
rather lame RAIIWrapper that I started with. :)
Thanks,
Andrew Sandoval
--=20
------=_Part_317_1524177.1353361877143
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
On Monday, November 19, 2012 3:46:16 PM UTC-6, Ville Voutilainen wrote:<blo=
ckquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-=
left: 1px #ccc solid;padding-left: 1ex;">On 19 November 2012 23:36, Mikael =
Kilpel=E4inen
<br><<a href=3D"javascript:" target=3D"_blank" gdf-obfuscated-mailto=3D"=
MODi7leGW6AJ">mikael.ki...@gmail.com</a>> wrote:
<br>>> Well, my big mouth lead me to be that proxy for optional. Chan=
ces are
<br>>> that the same will happen here. I'd prefer the proposal to be =
as ready
<br>>> as possible, if that contingency ends up materializing. :D
<br>> Well.. Just let me know if I can be of any help...
<br>
<br>Sure. Championing any proposal requires attending a meeting, so feel fr=
ee to
<br>join the delegation. ;)
<br></blockquote><div> </div><div>FWIW, if I am able I will go. =
And, I'm grateful for the interest and help everyone is offering. I r=
eally think this will be a good thing!<br><br>I appreciate the different id=
eas on a name. The are all better than the rather lame <span style=3D=
"font-family: courier new,monospace;">RAIIWrapper </span>that I started wit=
h. :)<br><br>Thanks,<br>Andrew Sandoval<br></div>
<p></p>
-- <br />
<br />
<br />
<br />
------=_Part_317_1524177.1353361877143--
.
Author: "Vicente J. Botet Escriba" <vicente.botet@wanadoo.fr>
Date: Tue, 20 Nov 2012 00:17:16 +0100
Raw View
Le 18/11/12 18:37, Ville Voutilainen a =E9crit :
> On 18 November 2012 19:30, Vicente J. Botet Escriba
> <vicente.botet@wanadoo.fr> wrote:
>> Resource requirements
>> R is a model of Resource if R is Regular and the following requireme=
nts
>> are satisfied where
>> R r;
>> R::value_type v;
>>
>> R::value_type
>> The type of the resource that shall be Regular also.
>>
>> R::invalid
>> the invalid value
>>
>> R()
>> Constructs an invalid resource.
>>
>> R(v)
>> Constructs a resource with a specific value.
>>
>> r.release()
>> Release the resource
>>
>>
>> Next follows an example of a generic resource using static information (=
as
>> the one used by unique_resource)
>>
>> template <typename R, R Invalid, void(*Release)(R)>
> That won't work for quite many resource types. To be able to use a resour=
ce
> as a non-type template parameter, we place quite stringent limitations
> on what a resource can be. Class types for example are right out.
>
The structure resource was just an example of a helper to build=20
resources. Nothing prevents you defining a less constraining resource as=20
far as it respect the requirements.
struct my_resource
{
typedef AClass value_type;
static constexpr value_type invalid() {return AClass();}; // if the=20
default constructor constructs an invalid resource
value_type value;
my_resource() noexcept : value(invalid()) {}
my_resource(value_type val) noexcept : value(val) {}
void release() {
value.Destroy(); // if the member Destroy represents the=20
release of the resource
};
};
The scoped_resource could even not require invalid as far a the release=20
function takes care of it.
struct my_resource
{
typedef AClass value_type;
value_type value;
my_resource() noexcept : value() {}
my_resource(value_type val) noexcept : value(val) {}
void release() {
if (value!=3D AClass())
value.destroy();
};
};
But I think that unique resource needs to work with an invalid resource=20
to mimics nullptr.
Vicente
--=20
.
Author: Andrew Sandoval <sandoval@netwaysglobal.com>
Date: Mon, 19 Nov 2012 19:55:02 -0800 (PST)
Raw View
------=_Part_528_29229039.1353383702700
Content-Type: text/plain; charset=ISO-8859-1
I've once again updated the proposal
<http://www.andrewlsandoval.com/scope_exit/>at
http://www.andrewlsandoval.com/scope_exit/.
Here are the outstanding issues that I am tracking and requesting feedback
on:
1. We need a better name for unique_resource. Additional suggestions
are welcome. I'm leaning towards resource_guard, or managed_resource,
but as you've already seen, naming isn't my specialty. :)
2. The header file name. Currently the proposal is using <scope_exit>.
I'm thinking maybe <scoped_resource> is better, especially seeing
<scoped_allocators>, etc. in the working draft of the standard.
3. Should scoped_resource_unchecked be spelled out in the proposal? Or
should it just spell out the need for a generator function *make_scoped_resource(resource,
deleter)* that returns a type similar to scoped_resource but without
validity checks?
4. Is the start that I've made on the "*standardese*" in the Technical
Specification section anywhere near correct? Is it worth pursuing
currently? What help is available for getting this right? (At the pace
I'm going it might take a year!)
5. Is it time to get an official document number?
6. Is it time to start a new thread, with the next update of the
proposal? (I say yes, this one is getting long.)
7. Many of you have provided help, but nobody has requested being added
to the proposal (acknowledgments or elsewhere). If you would like to be
added please feel free to e-mail me privately. I'd like to see recognition
go where it is due.
8. What else am I missing?
Thank you much,
Andrew Sandoval
--
------=_Part_528_29229039.1353383702700
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
I've once again updated the <a href=3D"http://www.andrewlsandoval.com/scope=
_exit/">proposal </a>at <a href=3D"http://www.andrewlsandoval.com/scope_exi=
t/">http://www.andrewlsandoval.com/scope_exit/</a>.<br><br>Here are the out=
standing issues that I am tracking and requesting feedback on:<br><ol><li>W=
e need a better name for <span style=3D"font-family: courier new,monospace;=
">unique_resource</span>. Additional suggestions are welcome. I=
'm leaning towards <span style=3D"font-family: courier new,monospace;">reso=
urce_guard</span>, or <span style=3D"font-family: courier new,monospace;">m=
anaged_resource</span>, but as you've already seen, naming isn't my special=
ty. :)<br></li><li>The header file name. Currently the proposal is us=
ing <span style=3D"font-family: courier new,monospace;"><scope_exit><=
/span>. I'm thinking maybe<span style=3D"font-family: courier new,mon=
ospace;"> <scoped_resource></span> is better, especially seeing <span=
style=3D"font-family: courier new,monospace;"><scoped_allocators></s=
pan>, etc. in the working draft of the standard.</li><li>Should <span style=
=3D"font-family: courier new,monospace;">scoped_resource_unchecked</span> b=
e spelled out in the proposal? Or should it just spell out the need f=
or a generator function <b><span style=3D"font-family: courier new,monospac=
e;">make_scoped_resource(resource, deleter)</span></b> that returns a type =
similar to <span style=3D"font-family: courier new,monospace;">scoped_resou=
rce</span> but without validity checks?</li><li>Is the start that I've made=
on the "<i>standardese</i>" in the Technical Specification section anywher=
e near correct? Is it worth pursuing currently? What help is av=
ailable for getting this right? (At the pace I'm going it might take =
a year!)<br></li><li>Is it time to get an official document number?</li><li=
>Is it time to start a new thread, with the next update of the proposal?&nb=
sp; (I say yes, this one is getting long.)</li><li>Many of you have provide=
d help, but nobody has requested being added to the proposal (acknowledgmen=
ts or elsewhere). If you would like to be added please feel free to e=
-mail me privately. I'd like to see recognition go where it is due.<b=
r></li><li>What else am I missing?</li></ol><p>Thank you much,</p><p>Andrew=
Sandoval<br></p><p><br></p>
<p></p>
-- <br />
<br />
<br />
<br />
------=_Part_528_29229039.1353383702700--
.
Author: =?ISO-8859-1?Q?Daniel_Kr=FCgler?= <daniel.kruegler@gmail.com>
Date: Tue, 20 Nov 2012 08:38:45 +0100
Raw View
--14dae9cdc93dea853d04cee85229
Content-Type: text/plain; charset=ISO-8859-1
2012/11/20 Andrew Sandoval <sandoval@netwaysglobal.com>
> I've once again updated the proposal
> <http://www.andrewlsandoval.com/scope_exit/>at
> http://www.andrewlsandoval.com/scope_exit/.
>
> Here are the outstanding issues that I am tracking and requesting feedback
> on:
>
> 1. We need a better name for unique_resource. Additional suggestions
> are welcome. I'm leaning towards resource_guard, or managed_resource,
> but as you've already seen, naming isn't my specialty. :)
>
>
I don't think that managed_resource is a good naming choice, because the
term "managed" is already overloaded in other contexts.
>
> 1.
> 2. The header file name. Currently the proposal is using <scope_exit>.
> I'm thinking maybe <scoped_resource> is better, especially seeing
> <scoped_allocators>, etc. in the working draft of the standard.
>
> I rule of thumb often is that the main component determines the header
name. Since you suggest for the header <scope_exit>, why isn't that the
name you would suggest for the component?
>
> 1. Is the start that I've made on the "*standardese*" in the Technical
> Specification section anywhere near correct? Is it worth pursuing
> currently? What help is available for getting this right? (At the pace
> I'm going it might take a year!)
>
> Sorry, haven't looked at your previous document yet, but I will do for
your next revision and can send you some comments in regard to standardese.
>
> 1.
> 2. Is it time to get an official document number?
>
> If you think that the proposal is ready for submission, then its time to
allocate a document number. In theory this could be done before, but I
don't recommend that in general. It would be especially useless once you
decide to withdraw your proposal ;-)
>
> 1. Is it time to start a new thread, with the next update of the
> proposal? (I say yes, this one is getting long.)
>
> Agreed.
- Daniel
--
--14dae9cdc93dea853d04cee85229
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
<div class=3D"gmail_quote">2012/11/20 Andrew Sandoval <span dir=3D"ltr"><=
;<a href=3D"mailto:sandoval@netwaysglobal.com" target=3D"_blank">sandoval@n=
etwaysglobal.com</a>></span><br><blockquote class=3D"gmail_quote" style=
=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
I've once again updated the <a href=3D"http://www.andrewlsandoval.com/s=
cope_exit/" target=3D"_blank">proposal </a>at <a href=3D"http://www.andrewl=
sandoval.com/scope_exit/" target=3D"_blank">http://www.andrewlsandoval.com/=
scope_exit/</a>.<br>
<br>Here are the outstanding issues that I am tracking and requesting feedb=
ack on:<br><ol><li>We need a better name for <span style=3D"font-family:cou=
rier new,monospace">unique_resource</span>.=A0 Additional suggestions are w=
elcome.=A0 I'm leaning towards <span style=3D"font-family:courier new,m=
onospace">resource_guard</span>, or <span style=3D"font-family:courier new,=
monospace">managed_resource</span>, but as you've already seen, naming =
isn't my specialty. :)<br>
</li></ol></blockquote><div><br>I don't think that managed_resource is =
a good naming choice, because the term "managed" is already overl=
oaded in other contexts.<br>=A0</div><blockquote class=3D"gmail_quote" styl=
e=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<ol><li></li><li>The header file name.=A0 Currently the proposal is using <=
span style=3D"font-family:courier new,monospace"><scope_exit></span>.=
=A0 I'm thinking maybe<span style=3D"font-family:courier new,monospace"=
> <scoped_resource></span> is better, especially seeing <span style=
=3D"font-family:courier new,monospace"><scoped_allocators></span>, et=
c. in the working draft of the standard.</li>
</ol></blockquote><div>I rule of thumb often is that the main component det=
ermines the header name. Since you suggest for the header <scope_exit>=
;, why isn't that the name you would suggest for the component?<br>
=A0</div><div></div><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0=
.8ex;border-left:1px #ccc solid;padding-left:1ex"><ol><li>Is the start tha=
t I've made on the "<i>standardese</i>" in the Technical Spec=
ification section anywhere near correct?=A0 Is it worth pursuing currently?=
=A0 What help is available for getting this right?=A0 (At the pace I'm =
going it might take a year!)<br>
</li></ol></blockquote><div>Sorry, haven't looked at your previous docu=
ment yet, but I will do for your next revision and can send you some commen=
ts in regard to standardese. <br></div><blockquote class=3D"gmail_quote" st=
yle=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<ol><li></li><li>Is it time to get an official document number?</li></ol></=
blockquote><div>If you think that the proposal is ready for submission, the=
n its time to allocate a document number. In theory this could be done befo=
re, but I don't recommend that in general. It would be especially usele=
ss once you decide to withdraw your proposal ;-)<br>
=A0</div><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;borde=
r-left:1px #ccc solid;padding-left:1ex"><ol><li>Is it time to start a new t=
hread, with the next update of the proposal?=A0 (I say yes, this one is get=
ting long.)</li>
</ol></blockquote><div>Agreed.<br>=A0<br>- Daniel<br></div></div>
<p></p>
-- <br />
<br />
<br />
<br />
--14dae9cdc93dea853d04cee85229--
.
Author: Andrew Sandoval <sandoval@netwaysglobal.com>
Date: Mon, 19 Nov 2012 06:36:00 -0800 (PST)
Raw View
------=_Part_327_9102210.1353335760283
Content-Type: text/plain; charset=ISO-8859-1
On Sunday, November 18, 2012 11:52:41 AM UTC-6, Ville Voutilainen wrote:
>
> On 17 November 2012 08:01, Andrew Sandoval <sand...@netwaysglobal.com<javascript:>>
> wrote:
> > Okay, I've updated the reference implementation to include these
> operators
> > and the option of throwing exception on validity failure. I've also
> changed
> > all of the "generator" function templates to more closely follow the
> > standard, so we now have make_scoped_function(), and
> make_scoped_resource().
> > I've updated draft of the proposal. It along with the links to the
> > reference implementation are still at
> > http://www.andrewlsandoval.com/scope_exit/.
> > I will soon begin trying to fill in the Technical Details. Prior to
> that
> > any additional feedback on the reference implementation or the proposal
> text
> > will be appreciated.
> > NOTE: The reference implementation requires std::remove_pointer and
> > std::add_reference for the operator*. When I tried compiling with g++
> 4.7.2
> > on Windows there were compiler errors related to these type_traits. (Or
> > maybe I just did something brain-dead.) I'll try to resolve that in the
> > morning, but if anyone has experience with the differences in
> type_traits
> > implementations and spots the problem before I do please let me know.
> > Otherwise thank you for being patient. It does compile fine with VS
> 2010.
>
> So, let me try to recap my understanding:
>
> 1) scoped_function just enables running a cleanup functor. Given a lambda,
> it provides the bare minimum possible. If lambdas are allowed to define
> how their captures are initialized, we have a quite good resource wrapper
> then. (I don't think this proposal needs to wait for lambdas to get the
> capture-initializers).
>
>
Correct.
> 2) scoped_resource_unchecked wraps a resource and its deleter, allows
> accessing it
> through the scoped_resource_unchecked, and handles eg. resetting.
>
>
Yes.
> 3) scoped_resource further allows recognizing invalid values, and provides
> the
> option to throw when initialized with an invalid value.
>
>
Yes, correct.
> 4) unique_resource is lighter-weight and saves space, because it
> doesn't actually store a deleter
> object.
>
>
Correct. It also doesn't store the no-delete value. (In short it requires
no storage.)
> Did I get it right so far?
>
> Yes, I believe so.
> Of these, I expect scoped_resource to be the "default", since it's the
> most capable and most generic.
>
I agree.
I have trouble with the name unique_resource, because I don't see it
> being similar to unique_ptr and
> unique_lock in the sense that those are move-only resource handles.
> The most important facility
> of unique_resource isn't uniqueness, but rather that it's a
> space-optimized variant of scoped_resource,
> and doesn't allow the same breadth of possible deleter types.
>
>
I am completely open to a better name.
> I think operator& and operator-> should return the same thing. It's
> actually a bit hairy to support both
> pointers and non-pointers in that space, especially with operator*.
> Also, some pointers are a bit hairy
> to begin with, like FILE*. I don't know how to solve that problem nicely.
>
I can do that. It is operator* that is giving me problems on g++. The
only way I could get it to work and be useful was like this:
//
// operator* for dereferencing pointer types
typename std::add_reference<typename std::remove_pointer<R>::type>::type
operator* () const
{
return *m_resource; // If applicable
}
I would actually prefer to use unique_ptr for most pointer types, or else
to use (whatever we call it) unique_resource with get() to a temporary and
then deference that if it is ever necessary...
So, I'm inclined to remove operator*. If operator& and operator-> returned
the same thing, would that be m_resource, or &m_resource? Why would you
pick one over the other then?
Thanks,
Andrew Sandoval
--
------=_Part_327_9102210.1353335760283
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
On Sunday, November 18, 2012 11:52:41 AM UTC-6, Ville Voutilainen wrote:<bl=
ockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border=
-left: 1px #ccc solid;padding-left: 1ex;">On 17 November 2012 08:01, Andrew=
Sandoval <<a href=3D"javascript:" target=3D"_blank" gdf-obfuscated-mail=
to=3D"KU_ne15vlK0J">sand...@netwaysglobal.com</a>> wrote:
<br>> Okay, I've updated the reference implementation to include these o=
perators
<br>> and the option of throwing exception on validity failure. I'=
ve also changed
<br>> all of the "generator" function templates to more closely follow t=
he
<br>> standard, so we now have make_scoped_function(), and make_scoped_r=
esource().
<br>> I've updated draft of the proposal. It along with the links =
to the
<br>> reference implementation are still at
<br>> <a href=3D"http://www.andrewlsandoval.com/scope_exit/" target=3D"_=
blank">http://www.andrewlsandoval.<wbr>com/scope_exit/</a>.
<br>> I will soon begin trying to fill in the Technical Details. P=
rior to that
<br>> any additional feedback on the reference implementation or the pro=
posal text
<br>> will be appreciated.
<br>> NOTE: The reference implementation requires std::remove_pointer an=
d
<br>> std::add_reference for the operator*. When I tried compiling=
with g++ 4.7.2
<br>> on Windows there were compiler errors related to these type_traits=
.. (Or
<br>> maybe I just did something brain-dead.) I'll try to resolve =
that in the
<br>> morning, but if anyone has experience with the differences in type=
_traits
<br>> implementations and spots the problem before I do please let me kn=
ow.
<br>> Otherwise thank you for being patient. It does compile fine =
with VS 2010.
<br>
<br>So, let me try to recap my understanding:
<br>
<br>1) scoped_function just enables running a cleanup functor. Given a lamb=
da,
<br>it provides the bare minimum possible. If lambdas are allowed to define
<br>how their captures are initialized, we have a quite good resource wrapp=
er
<br>then. (I don't think this proposal needs to wait for lambdas to get the
<br>capture-initializers).
<br>
<br></blockquote><div><br>Correct.<br> <br></div><blockquote class=3D"=
gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc so=
lid;padding-left: 1ex;">2) scoped_resource_unchecked wraps a resource and i=
ts deleter, allows
<br>accessing it
<br>through the scoped_resource_unchecked, and handles eg. resetting.
<br>
<br></blockquote><div><br>Yes.<br> <br></div><blockquote class=3D"gmai=
l_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;=
padding-left: 1ex;">3) scoped_resource further allows recognizing invalid v=
alues, and provides the
<br>option to throw when initialized with an invalid value.
<br>
<br></blockquote><div><br>Yes, correct.<br> <br></div><blockquote clas=
s=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #c=
cc solid;padding-left: 1ex;">4) unique_resource is lighter-weight and saves=
space, because it
<br>doesn't actually store a deleter
<br>object.
<br>
<br></blockquote><div><br>Correct. It also doesn't store the no-delet=
e value. (In short it requires no storage.)<br> <br></div><block=
quote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-le=
ft: 1px #ccc solid;padding-left: 1ex;">Did I get it right so far?
<br>
<br></blockquote><div>Yes, I believe so.<br> <br></div><blockquote cla=
ss=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #=
ccc solid;padding-left: 1ex;">Of these, I expect scoped_resource to be the =
"default", since it's the
<br>most capable and most generic.
<br></blockquote><div><br>I agree.<br><br></div><blockquote class=3D"gmail_=
quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;pa=
dding-left: 1ex;">I have trouble with the name unique_resource, because I d=
on't see it
<br>being similar to unique_ptr and
<br>unique_lock in the sense that those are move-only resource handles.
<br>The most important facility
<br>of unique_resource isn't uniqueness, but rather that it's a
<br>space-optimized variant of scoped_resource,
<br>and doesn't allow the same breadth of possible deleter types.
<br>
<br></blockquote><div><br>I am completely open to a better name.<br> <=
br></div><blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: =
0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;">I think operator&=
and operator-> should return the same thing. It's
<br>actually a bit hairy to support both
<br>pointers and non-pointers in that space, especially with operator*.
<br>Also, some pointers are a bit hairy
<br>to begin with, like FILE*. I don't know how to solve that problem nicel=
y.
<br></blockquote><div><br>I can do that. It is operator* that is givi=
ng me problems on g++. The only way I could get it to work and be use=
ful was like this:<br><div class=3D"prettyprint" style=3D"background-color:=
rgb(250, 250, 250); border-color: rgb(187, 187, 187); border-style: solid;=
border-width: 1px; word-wrap: break-word;"><code class=3D"prettyprint"><di=
v class=3D"subprettyprint"><span style=3D"color: #000;" class=3D"styled-by-=
prettify"> </span><span style=3D"color: #800;" c=
lass=3D"styled-by-prettify">//</span><span style=3D"color: #000;" class=3D"=
styled-by-prettify"><br> </span><span style=3D"c=
olor: #800;" class=3D"styled-by-prettify">// operator* for dereferencing po=
inter types</span><span style=3D"color: #000;" class=3D"styled-by-prettify"=
><br> </span><span style=3D"color: #008;" class=
=3D"styled-by-prettify">typename</span><span style=3D"color: #000;" class=
=3D"styled-by-prettify"> std</span><span style=3D"color: #660;" class=3D"st=
yled-by-prettify">::</span><span style=3D"color: #000;" class=3D"styled-by-=
prettify">add_reference</span><span style=3D"color: #660;" class=3D"styled-=
by-prettify"><</span><span style=3D"color: #008;" class=3D"styled-by-pre=
ttify">typename</span><span style=3D"color: #000;" class=3D"styled-by-prett=
ify"> std</span><span style=3D"color: #660;" class=3D"styled-by-prettify">:=
:</span><span style=3D"color: #000;" class=3D"styled-by-prettify">remove_po=
inter</span><span style=3D"color: #660;" class=3D"styled-by-prettify"><<=
/span><span style=3D"color: #000;" class=3D"styled-by-prettify">R</span><sp=
an style=3D"color: #660;" class=3D"styled-by-prettify">>::</span><span s=
tyle=3D"color: #000;" class=3D"styled-by-prettify">type</span><span style=
=3D"color: #660;" class=3D"styled-by-prettify">>::</span><span style=3D"=
color: #000;" class=3D"styled-by-prettify">type </span><span style=3D"color=
: #008;" class=3D"styled-by-prettify">operator</span><span style=3D"color: =
#660;" class=3D"styled-by-prettify">*</span><span style=3D"color: #000;" cl=
ass=3D"styled-by-prettify"> </span><span style=3D"color: #660;" class=3D"st=
yled-by-prettify">()</span><span style=3D"color: #000;" class=3D"styled-by-=
prettify"> </span><span style=3D"color: #008;" class=3D"styled-by-prettify"=
>const</span><span style=3D"color: #000;" class=3D"styled-by-prettify"><br>=
</span><span style=3D"color: #660;" class=3D"st=
yled-by-prettify">{</span><span style=3D"color: #000;" class=3D"styled-by-p=
rettify"><br> </span><span style=
=3D"color: #008;" class=3D"styled-by-prettify">return</span><span style=3D"=
color: #000;" class=3D"styled-by-prettify"> </span><span style=3D"color: #6=
60;" class=3D"styled-by-prettify">*</span><span style=3D"color: #000;" clas=
s=3D"styled-by-prettify">m_resource</span><span style=3D"color: #660;" clas=
s=3D"styled-by-prettify">;</span><span style=3D"color: #000;" class=3D"styl=
ed-by-prettify"> </span><span style=3D"color: #8=
00;" class=3D"styled-by-prettify">// If applicable</span><span style=3D"col=
or: #000;" class=3D"styled-by-prettify"><br> </s=
pan><span style=3D"color: #660;" class=3D"styled-by-prettify">}</span><span=
style=3D"color: #000;" class=3D"styled-by-prettify"><br></span></div></cod=
e></div><br><br><br>I would actually prefer to use unique_ptr for most poin=
ter types, or else to use (whatever we call it) unique_resource with get() =
to a temporary and then deference that if it is ever necessary... <br><br>S=
o, I'm inclined to remove operator*. If operator& and operator-&g=
t; returned the same thing, would that be m_resource, or &m_resource?&n=
bsp; Why would you pick one over the other then?<br><br>Thanks,<br>Andrew S=
andoval<br></div>
<p></p>
-- <br />
<br />
<br />
<br />
------=_Part_327_9102210.1353335760283--
.
Author: evgeny.panasyuk@gmail.com
Date: Fri, 8 Feb 2013 00:11:44 -0800 (PST)
Raw View
------=_Part_505_6392419.1360311105022
Content-Type: text/plain; charset=KOI8-R
Content-Transfer-Encoding: quoted-printable
13 nov 2012 =C7., 23:30:53 UTC+4 Vicente J. Botet Escriba :
>
> The proposal could be complemented with scoped_success, scoped_failure=20
> (based on D language). This could be possible updating std::
> uncaught_exception or any other mechanism so that failure or success=20
> conditions can be determined.
>
>
I have implemented scope(failure) and scope(success) features in C++ based=
=20
on platform specific function uncaught_exception_count.
It is similar to std::uncaught_exception, but instead of boolean result it=
=20
returns unsigned int showing current count of uncaught exceptions.=20
Currently it is tested on {Clang 3.2, GCC 3.4.6, GCC 4.1.2, GCC 4.4.6, GCC=
=20
4.4.7, MSVC2005SP1, MSVC2008SP1, MSVC2010SP1, MSVC2012} x {x32, x64}.
In C++11 following syntax is available:
scope(exit)
{
cout << "exit" << endl;
};
scope(failure)
{
cout << "failure" << endl;
};
scope(success)
{
cout << "success" << endl;
};
Links:
https://github.com/panaseleus/stack_unwinding
https://github.com/panaseleus/stack_unwinding/blob/master/examples/boost_sc=
opes_cpp11.cpp
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/?hl=3Den.
------=_Part_505_6392419.1360311105022
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
13 nov 2012 =D0=B3., 23:30:53 UTC+4 Vicente J. Botet Escriba :<br><blo=
ckquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-=
left: 1px #ccc solid;padding-left: 1ex;"><br><div bgcolor=3D"#FFFFFF" text=
=3D"#000000">
The proposal could be complemented with scoped_success,
scoped_failure (based on D language). This could be possible
updating <code><span>std</span><span>::</span><span>uncaught_exception<=
/span></code>
or any other mechanism so that failure or success conditions can be
determined.<br>
<br></div></blockquote><div><br>I have implemented scope(failure) and s=
cope(success) features in C++ based on platform specific function uncaught_=
exception_count.<br>It is similar to=20
std::uncaught_exception, but instead of boolean=20
result it returns unsigned int showing current count of uncaught=20
exceptions.=20
<p>Currently it is tested on {Clang 3.2, GCC 3.4.6, GCC 4.1.2, GCC=20
4.4.6, GCC 4.4.7, MSVC2005SP1, MSVC2008SP1, MSVC2010SP1, MSVC2012} x=20
{x32, x64}.</p><p>In C++11 following syntax is available:</p><p>scope(exit)=
<br>{<br> cout << "exit" << endl;<br>};<br>sc=
ope(failure)<br>{<br> cout << "failure" << en=
dl;<br>};<br>scope(success)<br>{<br> cout << "succe=
ss" << endl;<br>};<br></p><p>Links:</p><p>https://github.com/panasele=
us/stack_unwinding<br></p><p>https://github.com/panaseleus/stack_unwinding/=
blob/master/examples/boost_scopes_cpp11.cpp</p><p><br></p></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.<br />
To post to this group, send email to std-proposals@isocpp.org.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/?hl=3Den">http://groups.google.com/a/isocpp.org/group/std-pro=
posals/?hl=3Den</a>.<br />
<br />
<br />
------=_Part_505_6392419.1360311105022--
.
Author: Arthur Tchaikovsky <atch.cpp@gmail.com>
Date: Fri, 8 Feb 2013 09:17:32 +0000
Raw View
> For instance, do you really find:
>
> auto i = std::find_if(c.begin(), c.end(), [&](decltype(*c.end()) _){ return
> _.name == name; });
>
> worse than
>
> auto i = std::find_if(c.begin(), c.end(), MatchNameInFoo(name));
> Nevin ":-)" Liber <mailto:nevin@eviloverlord.com> (847) 691-1404
Yes, yes and trice yes. The whole point of using MatchNameInFoo is
that it tells us what it is doing and doesn't expose 'guts' - that's a
good thing. How could anyone think that:
[&](decltype(*c.end()) _){ return _.name == name; }
is more readable to:
MatchNameInFoo(name)
? How!?!
People, wake up! Even when I was copying this lambda I wasn't sure if
I did it correctly due to the '_' used. How is that for readability?
People wake up!
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en.
.
Author: Nikolay Ivchenkov <tsoae@mail.ru>
Date: Fri, 8 Feb 2013 06:11:22 -0800 (PST)
Raw View
------=_Part_762_25970152.1360332682801
Content-Type: text/plain; charset=ISO-8859-1
On Friday, February 8, 2013 1:17:32 PM UTC+4, Arthur Tchaikovsky wrote:
>
> > For instance, do you really find:
> >
> > auto i = std::find_if(c.begin(), c.end(), [&](decltype(*c.end()) _){
> return
> > _.name == name; });
> >
> > worse than
> >
> > auto i = std::find_if(c.begin(), c.end(), MatchNameInFoo(name));
>
> > Nevin ":-)" Liber <mailto:ne...@eviloverlord.com <javascript:>>
> (847) 691-1404
>
> Yes, yes and trice yes. The whole point of using MatchNameInFoo is
> that it tells us what it is doing and doesn't expose 'guts' - that's a
> good thing.
I strongly disagree. "Match" may mean a lot of entirely different things,
so name MatchNameInFoo doesn't expose the actual meaning of the operation
it is supposed to do. When you introude such entity into a program, you
have to defined its semantics somehow. If it is _by definition_ equivalent
to invocation_arg.name == ctor_arg, then MatchNameInFoo isn't an
essentially new abstraction layer and there are no reasons to hide the
comparison (it's not an implementation detail of an independent abstraction
layer).
> How could anyone think that:
>
> [&](decltype(*c.end()) _){ return _.name == name; }
>
> is more readable to:
>
> MatchNameInFoo(name)
The former could be more simple with well-designed polymorphic lambdas:
auto i = std::range::find_if(c, [&](auto &&x) => x.name == name);
or
auto i = std::range::find_if(c, [&][_1.name == name]);
I would find such code more readable than
auto i = std::range::find_if(c, MatchNameInFoo(name));
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en.
------=_Part_762_25970152.1360332682801
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
On Friday, February 8, 2013 1:17:32 PM UTC+4, Arthur Tchaikovsky wrote:<blo=
ckquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-=
left: 1px #ccc solid;padding-left: 1ex;">> For instance, do you really f=
ind:
<br>>
<br>> auto i =3D std::find_if(c.begin(), c.end(), [&](decltype(*c.en=
d()) _){ return
<br>> _.name =3D=3D name; });
<br>>
<br>> worse than
<br>>
<br>> auto i =3D std::find_if(c.begin(), c.end(), MatchNameInFoo(name));
<br>
<br>> Nevin ":-)" Liber <mailto:<a href=3D"javascript:" t=
arget=3D"_blank" gdf-obfuscated-mailto=3D"MptC5X9YuqUJ">ne...@eviloverlord.=
com</a>> (847) 691-1404
<br>
<br>Yes, yes and trice yes. The whole point of using MatchNameInFoo is
<br>that it tells us what it is doing and doesn't expose 'guts' - that's a
<br>good thing.</blockquote><div><br>I strongly disagree. "Match" may=20
mean a lot of entirely different things, so name MatchNameInFoo doesn't=20
expose the actual meaning of the operation it is supposed to do. When=20
you introude such entity into a program, you have to defined its=20
semantics somehow. If it is _by definition_ equivalent to=20
invocation_arg.name =3D=3D ctor_arg, then MatchNameInFoo isn't an =20
essentially new abstraction layer and there are no reasons to hide the=20
comparison (it's not an implementation detail of an independent=20
abstraction layer).<br> </div><blockquote class=3D"gmail_quote" style=
=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: =
1ex;"> How could anyone think that:
<br>
<br>[&](decltype(*c.end()) _){ return _.name =3D=3D name; }
<br>
<br>is more readable to:
<br>
<br>MatchNameInFoo(name)</blockquote><div><br>The former could be more simp=
le with well-designed polymorphic lambdas:<br><br> auto i=
=3D std::range::find_if(c, [&](auto &&x) =3D> x.name =3D=3D=
name);<br><br>or<br><br> auto i =3D std::range::find_if(=
c, [&][_1.name =3D=3D name]);<br><br>I would find such code more readab=
le than<br><br> auto i =3D std::range::find_if(c, MatchNameInF=
oo(name));<br></div>
<br>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.<br />
To post to this group, send email to std-proposals@isocpp.org.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/?hl=3Den">http://groups.google.com/a/isocpp.org/group/std-pro=
posals/?hl=3Den</a>.<br />
<br />
<br />
------=_Part_762_25970152.1360332682801--
.
Author: Arthur Tchaikovsky <atch.cpp@gmail.com>
Date: Sat, 9 Feb 2013 10:54:47 +0000
Raw View
a) we don't have well designed polymorphic lambdas
b) You are talking about different issue here, namely crisp and to the
point naming. Surely if name isn't descriptive then it is hard to get
the idea behind it, but when name is correctly chosen then you _do not
have to see_ its guts in order to get the idea what it is doing. And
this way you don't waste time on mentally going through code and
evaluating it in order to understand what it's going on. With lambdas
you simply don't have choice. If exposing guts is good idea, much
better than encapsulating them, then I agree with you that lambdas are
much more readable than function's names.
Just have a look at this:
auto i = std::range::find_if(c, [&][_1.name == name]);
and then this:
auto i = std::range::find_if(c, isSame(name));
Do I really need to spell it out? The second example virtually reads
as properly constructed english, the first one is at best cryptic. Why
is argument caught by ref? where '_1' came from, etc, etc, etc...
On 2/8/13, Nikolay Ivchenkov <tsoae@mail.ru> wrote:
> On Friday, February 8, 2013 1:17:32 PM UTC+4, Arthur Tchaikovsky wrote:
>>
>> > For instance, do you really find:
>> >
>> > auto i = std::find_if(c.begin(), c.end(), [&](decltype(*c.end()) _){
>> return
>> > _.name == name; });
>> >
>> > worse than
>> >
>> > auto i = std::find_if(c.begin(), c.end(), MatchNameInFoo(name));
>>
>> > Nevin ":-)" Liber <mailto:ne...@eviloverlord.com <javascript:>>
>> (847) 691-1404
>>
>> Yes, yes and trice yes. The whole point of using MatchNameInFoo is
>> that it tells us what it is doing and doesn't expose 'guts' - that's a
>> good thing.
>
>
> I strongly disagree. "Match" may mean a lot of entirely different things,
> so name MatchNameInFoo doesn't expose the actual meaning of the operation
> it is supposed to do. When you introude such entity into a program, you
> have to defined its semantics somehow. If it is _by definition_ equivalent
> to invocation_arg.name == ctor_arg, then MatchNameInFoo isn't an
> essentially new abstraction layer and there are no reasons to hide the
> comparison (it's not an implementation detail of an independent abstraction
>
> layer).
>
>
>> How could anyone think that:
>>
>> [&](decltype(*c.end()) _){ return _.name == name; }
>>
>> is more readable to:
>>
>> MatchNameInFoo(name)
>
>
> The former could be more simple with well-designed polymorphic lambdas:
>
> auto i = std::range::find_if(c, [&](auto &&x) => x.name == name);
>
> or
>
> auto i = std::range::find_if(c, [&][_1.name == name]);
>
> I would find such code more readable than
>
> auto i = std::range::find_if(c, MatchNameInFoo(name));
>
> --
>
> ---
> You received this message because you are subscribed to the Google Groups
> "ISO C++ Standard - Future Proposals" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to std-proposals+unsubscribe@isocpp.org.
> To post to this group, send email to std-proposals@isocpp.org.
> Visit this group at
> http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en.
>
>
>
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en.
.
Author: Tony V E <tvaneerd@gmail.com>
Date: Fri, 15 Feb 2013 12:30:50 -0500
Raw View
On Sat, Feb 9, 2013 at 5:54 AM, Arthur Tchaikovsky <atch.cpp@gmail.com> wrote:
> Just have a look at this:
> auto i = std::range::find_if(c, [&][_1.name == name]);
>
> and then this:
>
> auto i = std::range::find_if(c, isSame(name));
>
> Do I really need to spell it out? The second example virtually reads
> as properly constructed english, the first one is at best cryptic. Why
> is argument caught by ref? where '_1' came from, etc, etc, etc...
>
I think it depends why you are reading the code. 2 typical cases:
- I'm adding features. I might prefer isSame - it is higher level, I
can understand the code, maybe reuse it with new feature, etc.
- I'm looking for a bug. I prefer the lambda. I don't need to go
find isSame and see if that is where the bug is.
Also, I think we need to be careful about the abstraction - does
isSame() mean the *objects* are the same, and the fact that they are
compared/identified by name an implementation detail? Or should the
function be called isSameName(), because there could be other members
we could compare (isSameCountry(), isSameEmployer(),...). At which
point, what have you abstracted? There is the same level of detail in
the lambda and the function name.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en.
.
Author: Ville Voutilainen <ville.voutilainen@gmail.com>
Date: Fri, 15 Feb 2013 19:30:57 +0200
Raw View
On 9 February 2013 12:54, Arthur Tchaikovsky <atch.cpp@gmail.com> wrote:
> a) we don't have well designed polymorphic lambdas
> b) You are talking about different issue here, namely crisp and to the
> point naming. Surely if name isn't descriptive then it is hard to get
> the idea behind it, but when name is correctly chosen then you _do not
> have to see_ its guts in order to get the idea what it is doing. And
> this way you don't waste time on mentally going through code and
> evaluating it in order to understand what it's going on. With lambdas
> you simply don't have choice. If exposing guts is good idea, much
> better than encapsulating them, then I agree with you that lambdas are
> much more readable than function's names.
> Just have a look at this:
> auto i = std::range::find_if(c, [&][_1.name == name]);
> and then this:
> auto i = std::range::find_if(c, isSame(name));
> Do I really need to spell it out? The second example virtually reads
> as properly constructed english, the first one is at best cryptic. Why
> is argument caught by ref? where '_1' came from, etc, etc, etc...
How is this related to the topic at hand? I don't see a reason not to be able
to support both of those styles for a generic RAII facility, so what exactly
is the point of this debate here?
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en.
.
Author: DeadMG <wolfeinstein@gmail.com>
Date: Fri, 15 Feb 2013 13:48:33 -0800 (PST)
Raw View
------=_Part_8_1596801.1360964913653
Content-Type: text/plain; charset=ISO-8859-1
I agree with Martinho and Nicol. At best, you're talking about unique_ptr.
Firstly, all of your motivations are bad. A1 calls for a real RAII object,
and A2 simply calls for a for loop. B calls for a real RAII object,
ignoring the pre-existence of std::mutex, but again, can be implemented in
terms of unique_ptr. C can be implemented in terms of unique_ptr- and the
same for D too.
You have absolutely no compelling use cases for this at all which could not
be addressed by the use of an existing Standard facility.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en.
------=_Part_8_1596801.1360964913653
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
I agree with Martinho and Nicol. At best, you're talking about unique_ptr.<=
div><br></div><div>Firstly, all of your motivations are bad. A1 calls for a=
real RAII object, and A2 simply calls for a for loop. B calls for a real R=
AII object, ignoring the pre-existence of std::mutex, but again, can be imp=
lemented in terms of unique_ptr. C can be implemented in terms of unique_pt=
r- and the same for D too.</div><div><br></div><div>You have absolutely no =
compelling use cases for this at all which could not be addressed by the us=
e of an existing Standard facility.</div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.<br />
To post to this group, send email to std-proposals@isocpp.org.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/?hl=3Den">http://groups.google.com/a/isocpp.org/group/std-pro=
posals/?hl=3Den</a>.<br />
<br />
<br />
------=_Part_8_1596801.1360964913653--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Fri, 15 Feb 2013 12:54:13 -0800 (PST)
Raw View
------=_Part_186_5532745.1360961653468
Content-Type: text/plain; charset=ISO-8859-1
On Friday, February 15, 2013 9:30:50 AM UTC-8, Tony V E wrote:
>
> On Sat, Feb 9, 2013 at 5:54 AM, Arthur Tchaikovsky <atch...@gmail.com<javascript:>>
> wrote:
> > Just have a look at this:
> > auto i = std::range::find_if(c, [&][_1.name == name]);
> >
> > and then this:
> >
> > auto i = std::range::find_if(c, isSame(name));
> >
> > Do I really need to spell it out? The second example virtually reads
> > as properly constructed english, the first one is at best cryptic. Why
> > is argument caught by ref? where '_1' came from, etc, etc, etc...
> >
>
>
> I think it depends why you are reading the code. 2 typical cases:
>
> - I'm adding features. I might prefer isSame - it is higher level, I
> can understand the code, maybe reuse it with new feature, etc.
>
> - I'm looking for a bug. I prefer the lambda. I don't need to go
> find isSame and see if that is where the bug is.
>
Of course, `isSame` is less likely to have a bug in it at all, due to being
used in (presumably) many different places. Whereas every lambda equivalent
must be inspected to be certain that it is doing the comparison the same
way.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en.
------=_Part_186_5532745.1360961653468
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
<br><br>On Friday, February 15, 2013 9:30:50 AM UTC-8, Tony V E wrote:<bloc=
kquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-l=
eft: 1px #ccc solid;padding-left: 1ex;">On Sat, Feb 9, 2013 at 5:54 AM, Art=
hur Tchaikovsky <<a href=3D"javascript:" target=3D"_blank" gdf-obfuscate=
d-mailto=3D"Y93zSo0rUdYJ">atch...@gmail.com</a>> wrote:
<br>> Just have a look at this:
<br>> auto i =3D std::range::find_if(c, [&][_<a href=3D"http://1.nam=
e" target=3D"_blank">1.name</a> =3D=3D name]);
<br>>
<br>> and then this:
<br>>
<br>> auto i =3D std::range::find_if(c, isSame(name));
<br>>
<br>> Do I really need to spell it out? The second example virtually rea=
ds
<br>> as properly constructed english, the first one is at best cryptic.=
Why
<br>> is argument caught by ref? where '_1' came from, etc, etc, etc...
<br>>
<br>
<br>
<br>I think it depends why you are reading the code. 2 typical cases:
<br>
<br>- I'm adding features. I might prefer isSame - it is higher level=
, I
<br>can understand the code, maybe reuse it with new feature, etc.
<br>
<br>- I'm looking for a bug. I prefer the lambda. I don't need =
to go
<br>find isSame and see if that is where the bug is.<br></blockquote><div><=
br>Of course, `isSame` is less likely to have a bug in it at all, due to be=
ing used in (presumably) many different places. Whereas every lambda equiva=
lent must be inspected to be certain that it is doing the comparison the sa=
me way.</div><br>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.<br />
To post to this group, send email to std-proposals@isocpp.org.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/?hl=3Den">http://groups.google.com/a/isocpp.org/group/std-pro=
posals/?hl=3Den</a>.<br />
<br />
<br />
------=_Part_186_5532745.1360961653468--
.
Author: francisco.mailing.lists@oblita.com
Date: Fri, 15 Feb 2013 19:56:48 -0800 (PST)
Raw View
------=_Part_198_29283899.1360987008856
Content-Type: text/plain; charset=ISO-8859-1
Andrew Sandoval's reference implementation of his proposal is the single
sane thing I've found to raii-manage resources that are referred by (very)
common legacy opaque handles. I'm currently using it at my code.
I've discussed at length my views of the current usage of smart pointers
for this, it really doesn't fulfill my expectations / standards.
I hope more motivations or reinforcement of the ones already exposed can be
found here:
http://stackoverflow.com/q/14878121
http://stackoverflow.com/a/14902921
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en.
------=_Part_198_29283899.1360987008856
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Andrew Sandoval's reference implementation of his proposal is the single sa=
ne thing I've found to raii-manage resources that are referred by (very) co=
mmon legacy opaque handles. I'm currently using it at my code.<br><div><br>=
</div><div>I've discussed at length my views of the current usage of smart =
pointers for this, it really doesn't fulfill my expectations / standards.</=
div><div><br></div><div>I hope more motivations or reinforcement of the one=
s already exposed can be found here: </div><div><br></div><div>http://=
stackoverflow.com/q/14878121<br></div><div><br></div><div>http://stackoverf=
low.com/a/14902921<br></div><div><br></div><div><br></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.<br />
To post to this group, send email to std-proposals@isocpp.org.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/?hl=3Den">http://groups.google.com/a/isocpp.org/group/std-pro=
posals/?hl=3Den</a>.<br />
<br />
<br />
------=_Part_198_29283899.1360987008856--
.
Author: francisco.mailing.lists@oblita.com
Date: Fri, 15 Feb 2013 21:24:58 -0800 (PST)
Raw View
------=_Part_224_22713093.1360992298395
Content-Type: text/plain; charset=ISO-8859-1
I'll try to sum up some essentials of the semantics of *handles*, to show
how smart pointers, currently, are built toward pointers semantics and
breaks in handle semantics, even though they're, in my view, currently
being "tricked" for such usage.
- Handles are opaque entities.
A handle of "type" HANDLE may internally be a typedef (or define) to
void *. This doesn't mean it's a pointer to some position of memory. For
the API, the void * value may be used just as a index value in a table, and
it choses to use void * for sake of hiding. So endorsing unique_ptr<void,
deleter> not only violates encapsulation of the opaque handle type, it's
meaningless, it's a trick. And if you can't accept doing this trick, you
must make use a small wrapper around unique_ptr.
- Talking of the majority of cases, legacy handle "types" may be a
pointer type or an integral type.
There's no uniformity in syntax (or support) that takes account of this
equally with the current smart pointer options.
- Handles "types" may be built with #defines.
A given number of handle "types" in an specific C API may just be
#defines of the same type, like void *, but for sake of API interface,
they're viewed as different things. In such cases, the concept of
specializations of std::default_delete for such "types" won't work, hence
another smart pointer feature breaking in handle semantics.
My usage of the reference implementation of the proposal doesn't touch none
of those dirty corners. It feels natural to apply RAII to most kind of
handles without extra code.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en.
------=_Part_224_22713093.1360992298395
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
I'll try to sum up some essentials of the semantics of <i>handles</i>, to s=
how how smart pointers, currently, are built toward pointers semantics and =
breaks in handle semantics, even though they're, in my view, curr=
ently being "tricked" for such usage.<div><br></div><div> - Ha=
ndles are opaque entities.</div><div> A handle of "type=
" HANDLE may internally be a typedef (or define) to void *. This doesn't me=
an it's a pointer to some position of memory. For the API, the void * value=
may be used just as a index value in a table, and it choses to use void * =
for sake of hiding. So endorsing unique_ptr<void, deleter> not only v=
iolates encapsulation of the opaque handle type, it's meaningless, it's a t=
rick. And if you can't accept doing this trick, you must make use a small w=
rapper around unique_ptr.</div><div><br></div><div> - Talking =
of the majority of cases, legacy handle "types" may be a pointer type or an=
integral type.</div><div> There's no uniformity in syntax (or=
support) that takes account of this equally with the current smart pointer=
options.</div><div><br></div><div> - Handles "types" may be b=
uilt with #defines.</div><div> A given number of handle "types=
" in an specific C API may just be #defines of the same type, like void *, =
but for sake of API interface, they're viewed as different things. In such =
cases, the concept of specializations of std::default_delete for such "type=
s" won't work, hence another smart pointer feature breaking in handle seman=
tics.</div><div><br></div><div>My usage of the reference implementation of =
the proposal doesn't touch none of those dirty corners. It feels natural to=
apply RAII to most kind of handles without extra code.</div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.<br />
To post to this group, send email to std-proposals@isocpp.org.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/?hl=3Den">http://groups.google.com/a/isocpp.org/group/std-pro=
posals/?hl=3Den</a>.<br />
<br />
<br />
------=_Part_224_22713093.1360992298395--
.
Author: francisco.mailing.lists@oblita.com
Date: Fri, 15 Feb 2013 21:33:16 -0800 (PST)
Raw View
------=_Part_242_21647979.1360992796473
Content-Type: text/plain; charset=ISO-8859-1
Forgot a bullet
- Handles, by being opaque, doesn't ever need to be dereferenced.
The reference implementation wrappers impersonates the handle, turning
its usage for handles even more natural.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en.
------=_Part_242_21647979.1360992796473
Content-Type: text/html; charset=ISO-8859-1
Forgot a bullet<div><br></div><div> - Handles, by being opaque, doesn't ever need to be dereferenced.</div><div> The reference implementation wrappers impersonates the handle, turning its usage for handles even more natural.</div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.<br />
To post to this group, send email to std-proposals@isocpp.org.<br />
Visit this group at <a href="http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en">http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en</a>.<br />
<br />
<br />
------=_Part_242_21647979.1360992796473--
.
Author: Andrew Sandoval <sandoval@netwaysglobal.com>
Date: Fri, 15 Feb 2013 22:34:53 -0800 (PST)
Raw View
------=_Part_257_340698.1360996493305
Content-Type: text/plain; charset=ISO-8859-1
On Friday, February 15, 2013 9:56:48 PM UTC-6, francisco.m...@oblita.com
wrote:
>
> Andrew Sandoval's reference implementation of his proposal is the single
> sane thing I've found to raii-manage resources that are referred by (very)
> common legacy opaque handles. I'm currently using it at my code.
>
> I've discussed at length my views of the current usage of smart pointers
> for this, it really doesn't fulfill my expectations / standards.
>
> I hope more motivations or reinforcement of the ones already exposed can
> be found here:
>
> http://stackoverflow.com/q/14878121
>
> http://stackoverflow.com/a/14902921
>
> Thanks Francisco! FWIW, I've not given up on this proposal, I've just
been overwhelmed with other work. I also didn't notice that I've been
missing out on part of the conversation, until tonight...
Anyway, as soon as I get caught up, I intend to work on finishing the first
draft of the proposal. The "standardese" is very...time consuming, and I
may not be getting it right.
As for the reference implementation, in consulting with others who are
using it already, I think its good to go except that the name
unique_resource should probably be auto_resource. I know there is some
negative connotation associated with auto_ptr, but it fits what the class
does, and I believe the class is important -- maybe the most important of
all of them in the implementation -- just because it works naturally as a
class member where the make_scoped_function and make_scoped_resource
generated items generally only work well within a scope that doesn't
involve a constructor.
I don't know when the cut off for submitting proposals for the Bristol
meeting is, but I do hope to wrap this up soon. I am convinced that it
will be immensely beneficial to the standard library. And frankly, the
fact that people either love it or hate it bears that out.
Thanks all!
-Andrew Sandoval
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en.
------=_Part_257_340698.1360996493305
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
On Friday, February 15, 2013 9:56:48 PM UTC-6, francisco.m...@oblita.com wr=
ote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex=
;border-left: 1px #ccc solid;padding-left: 1ex;">Andrew Sandoval's referenc=
e implementation of his proposal is the single sane thing I've found to rai=
i-manage resources that are referred by (very) common legacy opaque handles=
.. I'm currently using it at my code.<br><div><br></div><div>I've discussed =
at length my views of the current usage of smart pointers for this, it real=
ly doesn't fulfill my expectations / standards.</div><div><br></div><div>I =
hope more motivations or reinforcement of the ones already exposed can be f=
ound here: </div><div><br></div><div><a href=3D"http://stackoverflow.c=
om/q/14878121" target=3D"_blank">http://stackoverflow.com/q/<wbr>14878121</=
a><br></div><div><br></div><div><a href=3D"http://stackoverflow.com/a/14902=
921" target=3D"_blank">http://stackoverflow.com/a/<wbr>14902921</a><br></di=
v><div><br></div></blockquote><div>Thanks Francisco! FWIW, I've not g=
iven up on this proposal, I've just been overwhelmed with other work. =
I also didn't notice that I've been missing out on part of the conversatio=
n, until tonight... <br><br>Anyway, as soon as I get caught up, I intend to=
work on finishing the first draft of the proposal. The "standardese"=
is very...time consuming, and I may not be getting it right.<br><br>As for=
the reference implementation, in consulting with others who are using it a=
lready, I think its good to go except that the name unique_resource should =
probably be auto_resource. I know there is some negative connotation =
associated with auto_ptr, but it fits what the class does, and I believe th=
e class is important -- maybe the most important of all of them in the impl=
ementation -- just because it works naturally as a class member where the m=
ake_scoped_function and make_scoped_resource generated items generally only=
work well within a scope that doesn't involve a constructor.<br><br>I don'=
t know when the cut off for submitting proposals for the Bristol meeting is=
, but I do hope to wrap this up soon. I am convinced that it will be =
immensely beneficial to the standard library. And frankly, the fact t=
hat people either love it or hate it bears that out.<br><br>Thanks all!<br>=
-Andrew Sandoval<br></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.<br />
To post to this group, send email to std-proposals@isocpp.org.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/?hl=3Den">http://groups.google.com/a/isocpp.org/group/std-pro=
posals/?hl=3Den</a>.<br />
<br />
<br />
------=_Part_257_340698.1360996493305--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Fri, 15 Feb 2013 22:50:33 -0800 (PST)
Raw View
------=_Part_233_7924713.1360997433835
Content-Type: text/plain; charset=ISO-8859-1
On Friday, February 15, 2013 10:34:53 PM UTC-8, Andrew Sandoval wrote:
>
> On Friday, February 15, 2013 9:56:48 PM UTC-6, francisco.m...@oblita.comwrote:
>>
>> Andrew Sandoval's reference implementation of his proposal is the single
>> sane thing I've found to raii-manage resources that are referred by (very)
>> common legacy opaque handles. I'm currently using it at my code.
>>
>> I've discussed at length my views of the current usage of smart pointers
>> for this, it really doesn't fulfill my expectations / standards.
>>
>> I hope more motivations or reinforcement of the ones already exposed can
>> be found here:
>>
>> http://stackoverflow.com/q/14878121
>>
>> http://stackoverflow.com/a/14902921
>>
>> Thanks Francisco! FWIW, I've not given up on this proposal, I've just
> been overwhelmed with other work. I also didn't notice that I've been
> missing out on part of the conversation, until tonight...
>
> Anyway, as soon as I get caught up, I intend to work on finishing the
> first draft of the proposal. The "standardese" is very...time consuming,
> and I may not be getting it right.
>
> As for the reference implementation, in consulting with others who are
> using it already, I think its good to go except that the name
> unique_resource should probably be auto_resource. I know there is some
> negative connotation associated with auto_ptr,
>
It's not about negative connotations. It's about "that's what we call
single-ownership things now." It's about consistency in the API. We don't
use auto_ptr anymore; it's deprecated. Therefore, if there's going to be an
object that encapsulates the concept of single-ownership of non-pointer
resources, it should be called "unique_*".
Otherwise, it's a pointless inconsistency that gains the API nothing. If
people see `unique_resource` alongside `unique_ptr`, then the API looks
uniform. If they see `auto_resource` and `unique_ptr`, confusion results.
Especially when they do a search and find out that there's an `auto_ptr`.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en.
------=_Part_233_7924713.1360997433835
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
<br><br>On Friday, February 15, 2013 10:34:53 PM UTC-8, Andrew Sandoval wro=
te:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;=
border-left: 1px #ccc solid;padding-left: 1ex;">On Friday, February 15, 201=
3 9:56:48 PM UTC-6, <a>francisco.m...@oblita.com</a> wrote:<blockquote clas=
s=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc =
solid;padding-left:1ex">Andrew Sandoval's reference implementation of his p=
roposal is the single sane thing I've found to raii-manage resources that a=
re referred by (very) common legacy opaque handles. I'm currently using it =
at my code.<br><div><br></div><div>I've discussed at length my views of the=
current usage of smart pointers for this, it really doesn't fulfill my exp=
ectations / standards.</div><div><br></div><div>I hope more motivations or =
reinforcement of the ones already exposed can be found here: </div><di=
v><br></div><div><a href=3D"http://stackoverflow.com/q/14878121" target=3D"=
_blank">http://stackoverflow.com/q/<wbr>14878121</a><br></div><div><br></di=
v><div><a href=3D"http://stackoverflow.com/a/14902921" target=3D"_blank">ht=
tp://stackoverflow.com/a/<wbr>14902921</a><br></div><div><br></div></blockq=
uote><div>Thanks Francisco! FWIW, I've not given up on this proposal,=
I've just been overwhelmed with other work. I also didn't notice tha=
t I've been missing out on part of the conversation, until tonight... <br><=
br>Anyway, as soon as I get caught up, I intend to work on finishing the fi=
rst draft of the proposal. The "standardese" is very...time consuming=
, and I may not be getting it right.<br><br>As for the reference implementa=
tion, in consulting with others who are using it already, I think its good =
to go except that the name unique_resource should probably be auto_resource=
.. I know there is some negative connotation associated with auto_ptr,=
</div></blockquote><div><br>It's not about negative connotations. It's abou=
t "that's what we call single-ownership things now." It's about consistency=
in the API. We don't use auto_ptr anymore; it's deprecated. Therefore, if =
there's going to be an object that encapsulates the concept of single-owner=
ship of non-pointer resources, it should be called "unique_*".<br><br>Other=
wise, it's a pointless inconsistency that gains the API nothing. If people =
see `unique_resource` alongside `unique_ptr`, then the API looks uniform. I=
f they see `auto_resource` and `unique_ptr`, confusion results. Especially =
when they do a search and find out that there's an `auto_ptr`.<br></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.<br />
To post to this group, send email to std-proposals@isocpp.org.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/?hl=3Den">http://groups.google.com/a/isocpp.org/group/std-pro=
posals/?hl=3Den</a>.<br />
<br />
<br />
------=_Part_233_7924713.1360997433835--
.
Author: francisco.mailing.lists@oblita.com
Date: Fri, 15 Feb 2013 22:56:31 -0800 (PST)
Raw View
------=_Part_265_30619199.1360997791712
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Em s=E1bado, 16 de fevereiro de 2013 04h50min33s UTC-2, Nicol Bolas escreve=
u:
>
>
>
> On Friday, February 15, 2013 10:34:53 PM UTC-8, Andrew Sandoval wrote:
>>
>> On Friday, February 15, 2013 9:56:48 PM UTC-6, francisco.m...@oblita.com=
wrote:
>>>
>>> Andrew Sandoval's reference implementation of his proposal is the singl=
e=20
>>> sane thing I've found to raii-manage resources that are referred by (ve=
ry)=20
>>> common legacy opaque handles. I'm currently using it at my code.
>>>
>>> I've discussed at length my views of the current usage of smart pointer=
s=20
>>> for this, it really doesn't fulfill my expectations / standards.
>>>
>>> I hope more motivations or reinforcement of the ones already exposed ca=
n=20
>>> be found here:=20
>>>
>>> http://stackoverflow.com/q/14878121
>>>
>>> http://stackoverflow.com/a/14902921
>>>
>>> Thanks Francisco! FWIW, I've not given up on this proposal, I've just=
=20
>> been overwhelmed with other work. I also didn't notice that I've been=
=20
>> missing out on part of the conversation, until tonight...=20
>>
>> Anyway, as soon as I get caught up, I intend to work on finishing the=20
>> first draft of the proposal. The "standardese" is very...time consuming=
,=20
>> and I may not be getting it right.
>>
>> As for the reference implementation, in consulting with others who are=
=20
>> using it already, I think its good to go except that the name=20
>> unique_resource should probably be auto_resource. I know there is some=
=20
>> negative connotation associated with auto_ptr,
>>
>
> It's not about negative connotations. It's about "that's what we call=20
> single-ownership things now." It's about consistency in the API. We don't=
=20
> use auto_ptr anymore; it's deprecated. Therefore, if there's going to be =
an=20
> object that encapsulates the concept of single-ownership of non-pointer=
=20
> resources, it should be called "unique_*".
>
> Otherwise, it's a pointless inconsistency that gains the API nothing. If=
=20
> people see `unique_resource` alongside `unique_ptr`, then the API looks=
=20
> uniform. If they see `auto_resource` and `unique_ptr`, confusion results.=
=20
> Especially when they do a search and find out that there's an `auto_ptr`.
>
I concur, what's the exact motivation for shifting the name to=20
auto_resource?=20
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/?hl=3Den.
------=_Part_265_30619199.1360997791712
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
<br><br>Em s=E1bado, 16 de fevereiro de 2013 04h50min33s UTC-2, Nicol Bolas=
escreveu:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left=
: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><br><br>On Friday, =
February 15, 2013 10:34:53 PM UTC-8, Andrew Sandoval wrote:<blockquote clas=
s=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc =
solid;padding-left:1ex">On Friday, February 15, 2013 9:56:48 PM UTC-6, <a>f=
rancisco.m...@oblita.com</a> wrote:<blockquote class=3D"gmail_quote" style=
=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-left:1ex"=
>Andrew Sandoval's reference implementation of his proposal is the single s=
ane thing I've found to raii-manage resources that are referred by (very) c=
ommon legacy opaque handles. I'm currently using it at my code.<br><div><br=
></div><div>I've discussed at length my views of the current usage of smart=
pointers for this, it really doesn't fulfill my expectations / standards.<=
/div><div><br></div><div>I hope more motivations or reinforcement of the on=
es already exposed can be found here: </div><div><br></div><div><a hre=
f=3D"http://stackoverflow.com/q/14878121" target=3D"_blank">http://stackove=
rflow.com/q/<wbr>14878121</a><br></div><div><br></div><div><a href=3D"http:=
//stackoverflow.com/a/14902921" target=3D"_blank">http://stackoverflow.com/=
a/<wbr>14902921</a><br></div><div><br></div></blockquote><div>Thanks Franci=
sco! FWIW, I've not given up on this proposal, I've just been overwhe=
lmed with other work. I also didn't notice that I've been missing out=
on part of the conversation, until tonight... <br><br>Anyway, as soon as I=
get caught up, I intend to work on finishing the first draft of the propos=
al. The "standardese" is very...time consuming, and I may not be gett=
ing it right.<br><br>As for the reference implementation, in consulting wit=
h others who are using it already, I think its good to go except that the n=
ame unique_resource should probably be auto_resource. I know there is=
some negative connotation associated with auto_ptr,</div></blockquote><div=
><br>It's not about negative connotations. It's about "that's what we call =
single-ownership things now." It's about consistency in the API. We don't u=
se auto_ptr anymore; it's deprecated. Therefore, if there's going to be an =
object that encapsulates the concept of single-ownership of non-pointer res=
ources, it should be called "unique_*".<br><br>Otherwise, it's a pointless =
inconsistency that gains the API nothing. If people see `unique_resource` a=
longside `unique_ptr`, then the API looks uniform. If they see `auto_resour=
ce` and `unique_ptr`, confusion results. Especially when they do a search a=
nd find out that there's an `auto_ptr`.<br></div></blockquote><div><br></di=
v><div>I concur, what's the exact motivation for shifting the name to auto_=
resource? </div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.<br />
To post to this group, send email to std-proposals@isocpp.org.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/?hl=3Den">http://groups.google.com/a/isocpp.org/group/std-pro=
posals/?hl=3Den</a>.<br />
<br />
<br />
------=_Part_265_30619199.1360997791712--
.
Author: francisco.mailing.lists@oblita.com
Date: Fri, 15 Feb 2013 23:28:37 -0800 (PST)
Raw View
------=_Part_325_26819703.1360999717784
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Em s=E1bado, 16 de fevereiro de 2013 04h56min31s UTC-2,=20
francisco.m...@oblita.com escreveu:
>
>
> Em s=E1bado, 16 de fevereiro de 2013 04h50min33s UTC-2, Nicol Bolas escre=
veu:
>>
>>
>>
>> On Friday, February 15, 2013 10:34:53 PM UTC-8, Andrew Sandoval wrote:
>>>
>>> On Friday, February 15, 2013 9:56:48 PM UTC-6, francisco.m...@oblita.co=
mwrote:
>>>>
>>>> Andrew Sandoval's reference implementation of his proposal is the=20
>>>> single sane thing I've found to raii-manage resources that are referre=
d by=20
>>>> (very) common legacy opaque handles. I'm currently using it at my code=
..
>>>>
>>>> I've discussed at length my views of the current usage of smart=20
>>>> pointers for this, it really doesn't fulfill my expectations / standar=
ds.
>>>>
>>>> I hope more motivations or reinforcement of the ones already exposed=
=20
>>>> can be found here:=20
>>>>
>>>> http://stackoverflow.com/q/14878121
>>>>
>>>> http://stackoverflow.com/a/14902921
>>>>
>>>> Thanks Francisco! FWIW, I've not given up on this proposal, I've just=
=20
>>> been overwhelmed with other work. I also didn't notice that I've been=
=20
>>> missing out on part of the conversation, until tonight...=20
>>>
>>> Anyway, as soon as I get caught up, I intend to work on finishing the=
=20
>>> first draft of the proposal. The "standardese" is very...time consumin=
g,=20
>>> and I may not be getting it right.
>>>
>>> As for the reference implementation, in consulting with others who are=
=20
>>> using it already, I think its good to go except that the name=20
>>> unique_resource should probably be auto_resource. I know there is some=
=20
>>> negative connotation associated with auto_ptr,
>>>
>>
>> It's not about negative connotations. It's about "that's what we call=20
>> single-ownership things now." It's about consistency in the API. We don'=
t=20
>> use auto_ptr anymore; it's deprecated. Therefore, if there's going to be=
an=20
>> object that encapsulates the concept of single-ownership of non-pointer=
=20
>> resources, it should be called "unique_*".
>>
>> Otherwise, it's a pointless inconsistency that gains the API nothing. If=
=20
>> people see `unique_resource` alongside `unique_ptr`, then the API looks=
=20
>> uniform. If they see `auto_resource` and `unique_ptr`, confusion results=
..=20
>> Especially when they do a search and find out that there's an `auto_ptr`=
..
>>
>
> I concur, what's the exact motivation for shifting the name to=20
> auto_resource?=20
>
Also, given were're talking about name, I'm fresh to the API, and I'd like=
=20
to pass a first impression I had once learning about it.
unique_resource: sounded fine, unique refers to the ownership type, so I=20
get a handle wrapper of unique ownership that take advantage of move=20
semantics.
scoped_resource: oh, scoped_resources are not about the resource being=20
destroyed on end of *current* scope, of course, because there's the move=20
semantics. What it does compared to unique_resource so? oh, it's a heavier=
=20
bro, I can use lambdas and functors with it. unique_resource is then an=20
stripped down version of this one. Should I expect "scoped" mean that?
unique_resource -> auto_resource: can't say much. Will need to look up why=
=20
of this naming.
Maybe the wrapper's characteristics are not particularly well stamped in=20
their names? There may be a trade off between clarity and succinctness I=20
know, not sure how to solve this =3D/
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/?hl=3Den.
------=_Part_325_26819703.1360999717784
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
<br>Em s=E1bado, 16 de fevereiro de 2013 04h56min31s UTC-2, francisco.m...@=
oblita.com escreveu:<br><blockquote class=3D"gmail_quote" style=3D"margin:=
0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><br><=
br>Em s=E1bado, 16 de fevereiro de 2013 04h50min33s UTC-2, Nicol Bolas esc=
reveu:<blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex=
;border-left:1px #ccc solid;padding-left:1ex"><br><br>On Friday, February 1=
5, 2013 10:34:53 PM UTC-8, Andrew Sandoval wrote:<blockquote class=3D"gmail=
_quote" style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;padd=
ing-left:1ex">On Friday, February 15, 2013 9:56:48 PM UTC-6, <a>francisco.m=
....@oblita.com</a> wrote:<blockquote class=3D"gmail_quote" style=3D"margin:=
0;margin-left:0.8ex;border-left:1px #ccc solid;padding-left:1ex">Andrew San=
doval's reference implementation of his proposal is the single sane thing I=
've found to raii-manage resources that are referred by (very) common legac=
y opaque handles. I'm currently using it at my code.<br><div><br></div><div=
>I've discussed at length my views of the current usage of smart pointers f=
or this, it really doesn't fulfill my expectations / standards.</div><div><=
br></div><div>I hope more motivations or reinforcement of the ones already =
exposed can be found here: </div><div><br></div><div><a href=3D"http:/=
/stackoverflow.com/q/14878121" target=3D"_blank">http://stackoverflow.com/q=
/<wbr>14878121</a><br></div><div><br></div><div><a href=3D"http://stackover=
flow.com/a/14902921" target=3D"_blank">http://stackoverflow.com/a/<wbr>1490=
2921</a><br></div><div><br></div></blockquote><div>Thanks Francisco! =
FWIW, I've not given up on this proposal, I've just been overwhelmed with o=
ther work. I also didn't notice that I've been missing out on part of=
the conversation, until tonight... <br><br>Anyway, as soon as I get caught=
up, I intend to work on finishing the first draft of the proposal. T=
he "standardese" is very...time consuming, and I may not be getting it righ=
t.<br><br>As for the reference implementation, in consulting with others wh=
o are using it already, I think its good to go except that the name unique_=
resource should probably be auto_resource. I know there is some negat=
ive connotation associated with auto_ptr,</div></blockquote><div><br>It's n=
ot about negative connotations. It's about "that's what we call single-owne=
rship things now." It's about consistency in the API. We don't use auto_ptr=
anymore; it's deprecated. Therefore, if there's going to be an object that=
encapsulates the concept of single-ownership of non-pointer resources, it =
should be called "unique_*".<br><br>Otherwise, it's a pointless inconsisten=
cy that gains the API nothing. If people see `unique_resource` alongside `u=
nique_ptr`, then the API looks uniform. If they see `auto_resource` and `un=
ique_ptr`, confusion results. Especially when they do a search and find out=
that there's an `auto_ptr`.<br></div></blockquote><div><br></div><div>I co=
ncur, what's the exact motivation for shifting the name to auto_resource?&n=
bsp;</div></blockquote><div><br></div><div>Also, given were're talking abou=
t name, I'm fresh to the API, and I'd like to pass a first impression I had=
once learning about it.</div><div><br></div><div>unique_resource: sounded =
fine, unique refers to the ownership type, so I get a handle wrapper of uni=
que ownership that take advantage of move semantics.</div><div><br></div><d=
iv>scoped_resource: oh, scoped_resources are not about the resource being d=
estroyed on end of <i>current</i> scope, of course, because there's the mov=
e semantics. What it does compared to unique_resource so? oh, it's a heavie=
r bro, I can use lambdas and functors with it. unique_resource is then an s=
tripped down version of this one. Should I expect "scoped" mean that?</div>=
<div><br></div><div>unique_resource -> auto_resource: can't say much. Wi=
ll need to look up why of this naming.</div><div><br></div><div>Maybe the w=
rapper's characteristics are not particularly well stamped in their names? =
There may be a trade off between clarity and succinctness I know, not sure =
how to solve this =3D/</div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.<br />
To post to this group, send email to std-proposals@isocpp.org.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/?hl=3Den">http://groups.google.com/a/isocpp.org/group/std-pro=
posals/?hl=3Den</a>.<br />
<br />
<br />
------=_Part_325_26819703.1360999717784--
.
Author: francisco.mailing.lists@oblita.com
Date: Fri, 15 Feb 2013 23:35:11 -0800 (PST)
Raw View
------=_Part_275_31818928.1361000111288
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Em s=E1bado, 16 de fevereiro de 2013 05h28min37s UTC-2,=20
francisco.m...@oblita.com escreveu:
> Also, given were're talking about name, I'm fresh to the API, and I'd lik=
e=20
> to pass a first impression I had once learning about it.
>
> unique_resource: sounded fine, unique refers to the ownership type, so I=
=20
> get a handle wrapper of unique ownership that take advantage of move=20
> semantics.
>
> scoped_resource: oh, scoped_resources are not about the resource being=20
> destroyed on end of *current* scope, of course, because there's the move=
=20
> semantics. What it does compared to unique_resource so? oh, it's a heavie=
r=20
> bro, I can use lambdas and functors with it. unique_resource is then an=
=20
> stripped down version of this one. Should I expect "scoped" mean that?
>
> unique_resource -> auto_resource: can't say much. Will need to look up wh=
y=20
> of this naming.
>
> Maybe the wrapper's characteristics are not particularly well stamped in=
=20
> their names? There may be a trade off between clarity and succinctness I=
=20
> know, not sure how to solve this =3D/
>
If I got it right what the two classes do, stripped_unique_resource (former=
=20
unique_resource) and unique_resource (former scoped_resource) would be more=
=20
clear / consistent for me (I know, stripped_unique_resource may not sound=
=20
that good).
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/?hl=3Den.
------=_Part_275_31818928.1361000111288
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Em s=E1bado, 16 de fevereiro de 2013 05h28min37s UTC-2, francisco.m...@obli=
ta.com escreveu:<br><blockquote class=3D"gmail_quote" style=3D"margin: 0;m=
argin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;">Also, giv=
en were're talking about name, I'm fresh to the API, and I'd like to pass a=
first impression I had once learning about it.<br><div><br></div><div>uniq=
ue_resource: sounded fine, unique refers to the ownership type, so I get a =
handle wrapper of unique ownership that take advantage of move semantics.</=
div><div><br></div><div>scoped_resource: oh, scoped_resources are not about=
the resource being destroyed on end of <i>current</i> scope, of course, be=
cause there's the move semantics. What it does compared to unique_resource =
so? oh, it's a heavier bro, I can use lambdas and functors with it. unique_=
resource is then an stripped down version of this one. Should I expect "sco=
ped" mean that?</div><div><br></div><div>unique_resource -> auto_resourc=
e: can't say much. Will need to look up why of this naming.</div><div><br><=
/div><div>Maybe the wrapper's characteristics are not particularly well sta=
mped in their names? There may be a trade off between clarity and succinctn=
ess I know, not sure how to solve this =3D/</div></blockquote><div><br></di=
v><div>If I got it right what the two classes do, stripped_unique_resource =
(former unique_resource) and unique_resource (former scoped_resource) would=
be more clear / consistent for me (I know, stripped_unique_resource may no=
t sound that good).</div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.<br />
To post to this group, send email to std-proposals@isocpp.org.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/?hl=3Den">http://groups.google.com/a/isocpp.org/group/std-pro=
posals/?hl=3Den</a>.<br />
<br />
<br />
------=_Part_275_31818928.1361000111288--
.
Author: francisco.mailing.lists@oblita.com
Date: Fri, 15 Feb 2013 23:56:44 -0800 (PST)
Raw View
------=_Part_333_22702793.1361001404651
Content-Type: text/plain; charset=ISO-8859-1
>
> If I got it right what the two classes do, stripped_unique_resource
> (former unique_resource) and unique_resource (former scoped_resource) would
> be more clear / consistent for me (I know, stripped_unique_resource may not
> sound that good).
>
restricted_unique_resource > stripped_unique_resource. "restricted"
referring to the restricted situations it may apply compared to its heavier
counterpart and its restricted usage of machine resources.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en.
------=_Part_333_22702793.1361001404651
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;bor=
der-left: 1px #ccc solid;padding-left: 1ex;"><div>If I got it right what th=
e two classes do, stripped_unique_resource (former unique_resource) and uni=
que_resource (former scoped_resource) would be more clear / consistent for =
me (I know, stripped_unique_resource may not sound that good).<br></div></b=
lockquote><div><br></div><div>restricted_unique_resource > strippe=
d_unique_resource. "restricted" referring to the restricted situations it m=
ay apply compared to its heavier counterpart and its restricted usage of ma=
chine resources. </div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.<br />
To post to this group, send email to std-proposals@isocpp.org.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/?hl=3Den">http://groups.google.com/a/isocpp.org/group/std-pro=
posals/?hl=3Den</a>.<br />
<br />
<br />
------=_Part_333_22702793.1361001404651--
.
Author: francisco.mailing.lists@oblita.com
Date: Sat, 16 Feb 2013 00:06:37 -0800 (PST)
Raw View
------=_Part_299_32556747.1361001997609
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Em s=E1bado, 16 de fevereiro de 2013 05h56min44s UTC-2,=20
francisco.m...@oblita.com escreveu:
> If I got it right what the two classes do, stripped_unique_resource=20
>> (former unique_resource) and unique_resource (former scoped_resource) wo=
uld=20
>> be more clear / consistent for me (I know, stripped_unique_resource may =
not=20
>> sound that good).
>>
>
> restricted_unique_resource > stripped_unique_resource. "restricted"=20
> referring to the restricted situations it may apply compared to its heavi=
er=20
> counterpart and its restricted usage of machine resources.=20
>
unique_resource_r would do for me, _r being a tag for "restricted".
unique_resource : full flagged single ownership resource wrapper.
unique_resource_r : restricted single ownership resource wrapper.
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/?hl=3Den.
------=_Part_299_32556747.1361001997609
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Em s=E1bado, 16 de fevereiro de 2013 05h56min44s UTC-2, francisco.m...@obli=
ta.com escreveu:<br><blockquote class=3D"gmail_quote" style=3D"margin: 0;m=
argin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><blockquo=
te class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-left:1p=
x #ccc solid;padding-left:1ex"><div>If I got it right what the two classes =
do, stripped_unique_resource (former unique_resource) and unique_resource (=
former scoped_resource) would be more clear / consistent for me (I know, st=
ripped_unique_resource may not sound that good).<br></div></blockquote><div=
><br></div><div>restricted_unique_resource > stripped_unique_resou=
rce. "restricted" referring to the restricted situations it may apply compa=
red to its heavier counterpart and its restricted usage of machine resource=
s. </div></blockquote><div><br></div><div>unique_resource_r would do f=
or me, _r being a tag for "restricted".</div><div><br></div><div>unique_res=
ource : full flagged single ownership resource wrapper.</div><div>uni=
que_resource_r : restricted single ownership resource wrapper.</div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.<br />
To post to this group, send email to std-proposals@isocpp.org.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/?hl=3Den">http://groups.google.com/a/isocpp.org/group/std-pro=
posals/?hl=3Den</a>.<br />
<br />
<br />
------=_Part_299_32556747.1361001997609--
.
Author: francisco.mailing.lists@oblita.com
Date: Sat, 16 Feb 2013 07:32:51 -0800 (PST)
Raw View
------=_Part_257_18808073.1361028771870
Content-Type: text/plain; charset=ISO-8859-1
Andrew, I've built a minimal test, I have some doubts in respect to
behavior, I think some of this is related with the "auto" name change:
#include <scope_exit>
typedef void *HMODULE;typedef const char *LPCSTR;typedef int BOOL;typedef int (*FARPROC) ();
HMODULE LoadLibrary(LPCSTR lpFileName) { return nullptr; }
BOOL FreeLibrary(HMODULE hModule) { return true; }
struct default_movable{
default_movable(const default_movable &) = delete;
default_movable &operator=(const default_movable &) = delete;
default_movable(default_movable &&) = default;
default_movable &operator=(default_movable &&) = default;
default_movable() : module(std::make_scoped_resource(LoadLibrary("/foo/bar.so"), FreeLibrary, static_cast<HMODULE>(nullptr))) {}
std::scoped_resource<decltype(&FreeLibrary), HMODULE> module;};
struct default_movable_r{
default_movable_r(const default_movable_r &) = delete;
default_movable_r &operator=(const default_movable_r &) = delete;
default_movable_r(default_movable_r &&) = default;
default_movable_r &operator=(default_movable_r &&) = default;
default_movable_r() : module(LoadLibrary("/foo/bar.so")) {}
std::unique_resource<UNIQUE_DELETER(FreeLibrary)> module;};
default_movable test_default_movable_for_moving(){
default_movable test;
return test;}
default_movable_r test_default_movable_r_for_moving(){
default_movable_r test_r;
return test_r;}
int main(){
default_movable test = test_default_movable_for_moving();
default_movable_r test_r = test_default_movable_r_for_moving();}
*confirmation*:
the first move to initialize test in main really transfer ownership of
the handle and FreeLibrary is then called solely on end of scope in main
right?
*doubt*:
the second move to initialize test_r in main gives an error because the
base class for unique_resource is not movable because of implicitly deleted
move constructor, so it can't be used is this context of ownership, hence
the name change?
Is there a limitation for this move do not be allowed? (I guess if so,
it must be highlighted in docs)
Regards,
Francisco Lopes
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en.
------=_Part_257_18808073.1361028771870
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Andrew, I've built a minimal test, I have some doubts in respect to behavio=
r, I think some of this is related with the "auto" name change:<div><br></d=
iv><div><pre id=3D"vimCodeElement" style=3D"-webkit-font-smoothing: antiali=
ased; font-family: consolas, monospace; color: rgb(211, 211, 211); backgrou=
nd-color: rgb(32, 32, 32);"><span class=3D"PreProc" style=3D"font-size: 1em=
; color: rgb(250, 244, 198);">#include </span><span class=3D"String" style=
=3D"font-size: 1em; color: rgb(177, 214, 49); font-style: italic;"><scop=
e_exit></span>
<span class=3D"Type" style=3D"font-size: 1em; color: rgb(126, 138, 162);">t=
ypedef</span> <span class=3D"Type" style=3D"font-size: 1em; color: rgb(126,=
138, 162);">void</span> <span class=3D"op_lv0" style=3D"font-size: 1em; co=
lor: rgb(160, 32, 240);">*</span>HMODULE<span class=3D"op_lv0" style=3D"fon=
t-size: 1em; color: rgb(160, 32, 240);">;</span>
<span class=3D"Type" style=3D"font-size: 1em; color: rgb(126, 138, 162);">t=
ypedef</span> <span class=3D"Type" style=3D"font-size: 1em; color: rgb(126,=
138, 162);">const</span> <span class=3D"Type" style=3D"font-size: 1em; col=
or: rgb(126, 138, 162);">char</span> <span class=3D"op_lv0" style=3D"font-s=
ize: 1em; color: rgb(160, 32, 240);">*</span>LPCSTR<span class=3D"op_lv0" s=
tyle=3D"font-size: 1em; color: rgb(160, 32, 240);">;</span>
<span class=3D"Type" style=3D"font-size: 1em; color: rgb(126, 138, 162);">t=
ypedef</span> <span class=3D"Type" style=3D"font-size: 1em; color: rgb(126,=
138, 162);">int</span> BOOL<span class=3D"op_lv0" style=3D"font-size: 1em;=
color: rgb(160, 32, 240);">;</span>
<span class=3D"Type" style=3D"font-size: 1em; color: rgb(126, 138, 162);">t=
ypedef</span> <span class=3D"Type" style=3D"font-size: 1em; color: rgb(126,=
138, 162);">int</span> <span class=3D"lv6c" style=3D"font-size: 1em; color=
: rgb(0, 191, 255);">(</span><span class=3D"op_lv6" style=3D"font-size: 1em=
; color: rgb(0, 191, 255);">*</span>FARPROC<span class=3D"lv6c" style=3D"fo=
nt-size: 1em; color: rgb(0, 191, 255);">)</span> <span class=3D"lv6c" style=
=3D"font-size: 1em; color: rgb(0, 191, 255);">()</span><span class=3D"op_lv=
0" style=3D"font-size: 1em; color: rgb(160, 32, 240);">;</span>
HMODULE LoadLibrary<span class=3D"lv6c" style=3D"font-size: 1em; color: rgb=
(0, 191, 255);">(</span>LPCSTR lpFileName<span class=3D"lv6c" style=3D"font=
-size: 1em; color: rgb(0, 191, 255);">)</span> <span class=3D"lv6c" style=
=3D"font-size: 1em; color: rgb(0, 191, 255);">{</span> <span class=3D"State=
ment" style=3D"font-size: 1em; color: rgb(126, 138, 162);">return</span> <s=
pan class=3D"Number" style=3D"font-size: 1em; color: rgb(255, 152, 0);">nul=
lptr</span><span class=3D"op_lv6" style=3D"font-size: 1em; color: rgb(0, 19=
1, 255);">;</span> <span class=3D"lv6c" style=3D"font-size: 1em; color: rgb=
(0, 191, 255);">}</span>
BOOL FreeLibrary<span class=3D"lv6c" style=3D"font-size: 1em; color: rgb(0,=
191, 255);">(</span>HMODULE hModule<span class=3D"lv6c" style=3D"font-size=
: 1em; color: rgb(0, 191, 255);">)</span> <span class=3D"lv6c" style=3D"fon=
t-size: 1em; color: rgb(0, 191, 255);">{</span> <span class=3D"Statement" s=
tyle=3D"font-size: 1em; color: rgb(126, 138, 162);">return</span> <span cla=
ss=3D"Boolean" style=3D"font-size: 1em; color: rgb(177, 214, 49);">true</sp=
an><span class=3D"op_lv6" style=3D"font-size: 1em; color: rgb(0, 191, 255);=
">;</span> <span class=3D"lv6c" style=3D"font-size: 1em; color: rgb(0, 191,=
255);">}</span>
<span class=3D"Type" style=3D"font-size: 1em; color: rgb(126, 138, 162);">s=
truct</span> default_movable
<span class=3D"lv6c" style=3D"font-size: 1em; color: rgb(0, 191, 255);">{</=
span>
default_movable<span class=3D"lv5c" style=3D"font-size: 1em; color: rgb=
(127, 255, 0);">(</span><span class=3D"Type" style=3D"font-size: 1em; color=
: rgb(126, 138, 162);">const</span> default_movable <span class=3D"op_lv5" =
style=3D"font-size: 1em; color: rgb(127, 255, 0);">&</span><span class=
=3D"lv5c" style=3D"font-size: 1em; color: rgb(127, 255, 0);">)</span> <span=
class=3D"op_lv6" style=3D"font-size: 1em; color: rgb(0, 191, 255);">=3D</s=
pan> <span class=3D"Statement" style=3D"font-size: 1em; color: rgb(126, 138=
, 162);">delete</span><span class=3D"op_lv6" style=3D"font-size: 1em; color=
: rgb(0, 191, 255);">;</span>
default_movable <span class=3D"op_lv6" style=3D"font-size: 1em; color: =
rgb(0, 191, 255);">&</span><span class=3D"Statement" style=3D"font-size=
: 1em; color: rgb(126, 138, 162);">operator</span><span class=3D"op_lv6" st=
yle=3D"font-size: 1em; color: rgb(0, 191, 255);">=3D</span><span class=3D"l=
v5c" style=3D"font-size: 1em; color: rgb(127, 255, 0);">(</span><span class=
=3D"Type" style=3D"font-size: 1em; color: rgb(126, 138, 162);">const</span>=
default_movable <span class=3D"op_lv5" style=3D"font-size: 1em; color: rgb=
(127, 255, 0);">&</span><span class=3D"lv5c" style=3D"font-size: 1em; c=
olor: rgb(127, 255, 0);">)</span> <span class=3D"op_lv6" style=3D"font-size=
: 1em; color: rgb(0, 191, 255);">=3D</span> <span class=3D"Statement" style=
=3D"font-size: 1em; color: rgb(126, 138, 162);">delete</span><span class=3D=
"op_lv6" style=3D"font-size: 1em; color: rgb(0, 191, 255);">;</span>
default_movable<span class=3D"lv5c" style=3D"font-size: 1em; color: rgb=
(127, 255, 0);">(</span>default_movable <span class=3D"op_lv5" style=3D"fon=
t-size: 1em; color: rgb(127, 255, 0);">&&</span><span class=3D"lv5c=
" style=3D"font-size: 1em; color: rgb(127, 255, 0);">)</span> <span class=
=3D"op_lv6" style=3D"font-size: 1em; color: rgb(0, 191, 255);">=3D</span> <=
span class=3D"Statement" style=3D"font-size: 1em; color: rgb(126, 138, 162)=
;">default</span><span class=3D"op_lv6" style=3D"font-size: 1em; color: rgb=
(0, 191, 255);">;</span>
default_movable <span class=3D"op_lv6" style=3D"font-size: 1em; color: =
rgb(0, 191, 255);">&</span><span class=3D"Statement" style=3D"font-size=
: 1em; color: rgb(126, 138, 162);">operator</span><span class=3D"op_lv6" st=
yle=3D"font-size: 1em; color: rgb(0, 191, 255);">=3D</span><span class=3D"l=
v5c" style=3D"font-size: 1em; color: rgb(127, 255, 0);">(</span>default_mov=
able <span class=3D"op_lv5" style=3D"font-size: 1em; color: rgb(127, 255, 0=
);">&&</span><span class=3D"lv5c" style=3D"font-size: 1em; color: r=
gb(127, 255, 0);">)</span> <span class=3D"op_lv6" style=3D"font-size: 1em; =
color: rgb(0, 191, 255);">=3D</span> <span class=3D"Statement" style=3D"fon=
t-size: 1em; color: rgb(126, 138, 162);">default</span><span class=3D"op_lv=
6" style=3D"font-size: 1em; color: rgb(0, 191, 255);">;</span>
default_movable<span class=3D"lv5c" style=3D"font-size: 1em; color: rgb=
(127, 255, 0);">()</span> <span class=3D"op_lv6" style=3D"font-size: 1em; c=
olor: rgb(0, 191, 255);">:</span> module<span class=3D"lv5c" style=3D"font-=
size: 1em; color: rgb(127, 255, 0);">(</span>std<span class=3D"op_lv5" styl=
e=3D"font-size: 1em; color: rgb(127, 255, 0);">::</span>make_scoped_resourc=
e<span class=3D"lv4c" style=3D"font-size: 1em; color: rgb(255, 255, 0);">(<=
/span>LoadLibrary<span class=3D"lv3c" style=3D"font-size: 1em; color: rgb(2=
55, 127, 80);">(</span><span class=3D"String" style=3D"font-size: 1em; colo=
r: rgb(177, 214, 49); font-style: italic;">"/foo/bar.so"</span><span class=
=3D"lv3c" style=3D"font-size: 1em; color: rgb(255, 127, 80);">)</span><span=
class=3D"op_lv4" style=3D"font-size: 1em; color: rgb(255, 255, 0);">,</spa=
n> FreeLibrary<span class=3D"op_lv4" style=3D"font-size: 1em; color: rgb(25=
5, 255, 0);">,</span> <span class=3D"Statement" style=3D"font-size: 1em; co=
lor: rgb(126, 138, 162);">static_cast</span><span class=3D"lv3c" style=3D"f=
ont-size: 1em; color: rgb(255, 127, 80);"><</span>HMODULE<span class=3D"=
lv3c" style=3D"font-size: 1em; color: rgb(255, 127, 80);">>(</span><span=
class=3D"Number" style=3D"font-size: 1em; color: rgb(255, 152, 0);">nullpt=
r</span><span class=3D"lv3c" style=3D"font-size: 1em; color: rgb(255, 127, =
80);">)</span><span class=3D"lv4c" style=3D"font-size: 1em; color: rgb(255,=
255, 0);">)</span><span class=3D"lv5c" style=3D"font-size: 1em; color: rgb=
(127, 255, 0);">)</span> <span class=3D"lv5c" style=3D"font-size: 1em; colo=
r: rgb(127, 255, 0);">{}</span>
std<span class=3D"op_lv6" style=3D"font-size: 1em; color: rgb(0, 191, 2=
55);">::</span>scoped_resource<span class=3D"lv5c" style=3D"font-size: 1em;=
color: rgb(127, 255, 0);"><</span><span class=3D"Statement" style=3D"fo=
nt-size: 1em; color: rgb(126, 138, 162);">decltype</span><span class=3D"lv4=
c" style=3D"font-size: 1em; color: rgb(255, 255, 0);">(</span><span class=
=3D"op_lv4" style=3D"font-size: 1em; color: rgb(255, 255, 0);">&</span>=
FreeLibrary<span class=3D"lv4c" style=3D"font-size: 1em; color: rgb(255, 25=
5, 0);">)</span><span class=3D"op_lv5" style=3D"font-size: 1em; color: rgb(=
127, 255, 0);">,</span> HMODULE<span class=3D"lv5c" style=3D"font-size: 1em=
; color: rgb(127, 255, 0);">></span> module<span class=3D"op_lv6" style=
=3D"font-size: 1em; color: rgb(0, 191, 255);">;</span>
<span class=3D"lv6c" style=3D"font-size: 1em; color: rgb(0, 191, 255);">}</=
span><span class=3D"op_lv0" style=3D"font-size: 1em; color: rgb(160, 32, 24=
0);">;</span>
<span class=3D"Type" style=3D"font-size: 1em; color: rgb(126, 138, 162);">s=
truct</span> default_movable_r
<span class=3D"lv6c" style=3D"font-size: 1em; color: rgb(0, 191, 255);">{</=
span>
default_movable_r<span class=3D"lv5c" style=3D"font-size: 1em; color: r=
gb(127, 255, 0);">(</span><span class=3D"Type" style=3D"font-size: 1em; col=
or: rgb(126, 138, 162);">const</span> default_movable_r <span class=3D"op_l=
v5" style=3D"font-size: 1em; color: rgb(127, 255, 0);">&</span><span cl=
ass=3D"lv5c" style=3D"font-size: 1em; color: rgb(127, 255, 0);">)</span> <s=
pan class=3D"op_lv6" style=3D"font-size: 1em; color: rgb(0, 191, 255);">=3D=
</span> <span class=3D"Statement" style=3D"font-size: 1em; color: rgb(126, =
138, 162);">delete</span><span class=3D"op_lv6" style=3D"font-size: 1em; co=
lor: rgb(0, 191, 255);">;</span>
default_movable_r <span class=3D"op_lv6" style=3D"font-size: 1em; color=
: rgb(0, 191, 255);">&</span><span class=3D"Statement" style=3D"font-si=
ze: 1em; color: rgb(126, 138, 162);">operator</span><span class=3D"op_lv6" =
style=3D"font-size: 1em; color: rgb(0, 191, 255);">=3D</span><span class=3D=
"lv5c" style=3D"font-size: 1em; color: rgb(127, 255, 0);">(</span><span cla=
ss=3D"Type" style=3D"font-size: 1em; color: rgb(126, 138, 162);">const</spa=
n> default_movable_r <span class=3D"op_lv5" style=3D"font-size: 1em; color:=
rgb(127, 255, 0);">&</span><span class=3D"lv5c" style=3D"font-size: 1e=
m; color: rgb(127, 255, 0);">)</span> <span class=3D"op_lv6" style=3D"font-=
size: 1em; color: rgb(0, 191, 255);">=3D</span> <span class=3D"Statement" s=
tyle=3D"font-size: 1em; color: rgb(126, 138, 162);">delete</span><span clas=
s=3D"op_lv6" style=3D"font-size: 1em; color: rgb(0, 191, 255);">;</span>
default_movable_r<span class=3D"lv5c" style=3D"font-size: 1em; color: r=
gb(127, 255, 0);">(</span>default_movable_r <span class=3D"op_lv5" style=3D=
"font-size: 1em; color: rgb(127, 255, 0);">&&</span><span class=3D"=
lv5c" style=3D"font-size: 1em; color: rgb(127, 255, 0);">)</span> <span cla=
ss=3D"op_lv6" style=3D"font-size: 1em; color: rgb(0, 191, 255);">=3D</span>=
<span class=3D"Statement" style=3D"font-size: 1em; color: rgb(126, 138, 16=
2);">default</span><span class=3D"op_lv6" style=3D"font-size: 1em; color: r=
gb(0, 191, 255);">;</span>
default_movable_r <span class=3D"op_lv6" style=3D"font-size: 1em; color=
: rgb(0, 191, 255);">&</span><span class=3D"Statement" style=3D"font-si=
ze: 1em; color: rgb(126, 138, 162);">operator</span><span class=3D"op_lv6" =
style=3D"font-size: 1em; color: rgb(0, 191, 255);">=3D</span><span class=3D=
"lv5c" style=3D"font-size: 1em; color: rgb(127, 255, 0);">(</span>default_m=
ovable_r <span class=3D"op_lv5" style=3D"font-size: 1em; color: rgb(127, 25=
5, 0);">&&</span><span class=3D"lv5c" style=3D"font-size: 1em; colo=
r: rgb(127, 255, 0);">)</span> <span class=3D"op_lv6" style=3D"font-size: 1=
em; color: rgb(0, 191, 255);">=3D</span> <span class=3D"Statement" style=3D=
"font-size: 1em; color: rgb(126, 138, 162);">default</span><span class=3D"o=
p_lv6" style=3D"font-size: 1em; color: rgb(0, 191, 255);">;</span>
default_movable_r<span class=3D"lv5c" style=3D"font-size: 1em; color: r=
gb(127, 255, 0);">()</span> <span class=3D"op_lv6" style=3D"font-size: 1em;=
color: rgb(0, 191, 255);">:</span> module<span class=3D"lv5c" style=3D"fon=
t-size: 1em; color: rgb(127, 255, 0);">(</span>LoadLibrary<span class=3D"lv=
4c" style=3D"font-size: 1em; color: rgb(255, 255, 0);">(</span><span class=
=3D"String" style=3D"font-size: 1em; color: rgb(177, 214, 49); font-style: =
italic;">"/foo/bar.so"</span><span class=3D"lv4c" style=3D"font-size: 1em; =
color: rgb(255, 255, 0);">)</span><span class=3D"lv5c" style=3D"font-size: =
1em; color: rgb(127, 255, 0);">)</span> <span class=3D"lv5c" style=3D"font-=
size: 1em; color: rgb(127, 255, 0);">{}</span>
std<span class=3D"op_lv6" style=3D"font-size: 1em; color: rgb(0, 191, 2=
55);">::</span>unique_resource<span class=3D"lv5c" style=3D"font-size: 1em;=
color: rgb(127, 255, 0);"><</span>UNIQUE_DELETER<span class=3D"lv4c" st=
yle=3D"font-size: 1em; color: rgb(255, 255, 0);">(</span>FreeLibrary<span c=
lass=3D"lv4c" style=3D"font-size: 1em; color: rgb(255, 255, 0);">)</span><s=
pan class=3D"lv5c" style=3D"font-size: 1em; color: rgb(127, 255, 0);">><=
/span> module<span class=3D"op_lv6" style=3D"font-size: 1em; color: rgb(0, =
191, 255);">;</span>
<span class=3D"lv6c" style=3D"font-size: 1em; color: rgb(0, 191, 255);">}</=
span><span class=3D"op_lv0" style=3D"font-size: 1em; color: rgb(160, 32, 24=
0);">;</span>
default_movable test_default_movable_for_moving<span class=3D"lv6c" style=
=3D"font-size: 1em; color: rgb(0, 191, 255);">()</span>
<span class=3D"lv6c" style=3D"font-size: 1em; color: rgb(0, 191, 255);">{</=
span>
default_movable test<span class=3D"op_lv6" style=3D"font-size: 1em; col=
or: rgb(0, 191, 255);">;</span>
<span class=3D"Statement" style=3D"font-size: 1em; color: rgb(126, 138,=
162);">return</span> test<span class=3D"op_lv6" style=3D"font-size: 1em; c=
olor: rgb(0, 191, 255);">;</span>
<span class=3D"lv6c" style=3D"font-size: 1em; color: rgb(0, 191, 255);">}</=
span>
default_movable_r test_default_movable_r_for_moving<span class=3D"lv6c" sty=
le=3D"font-size: 1em; color: rgb(0, 191, 255);">()</span>
<span class=3D"lv6c" style=3D"font-size: 1em; color: rgb(0, 191, 255);">{</=
span>
default_movable_r test_r<span class=3D"op_lv6" style=3D"font-size: 1em;=
color: rgb(0, 191, 255);">;</span>
<span class=3D"Statement" style=3D"font-size: 1em; color: rgb(126, 138,=
162);">return</span> test_r<span class=3D"op_lv6" style=3D"font-size: 1em;=
color: rgb(0, 191, 255);">;</span>
<span class=3D"lv6c" style=3D"font-size: 1em; color: rgb(0, 191, 255);">}</=
span>
<span class=3D"Type" style=3D"font-size: 1em; color: rgb(126, 138, 162);">i=
nt</span> main<span class=3D"lv6c" style=3D"font-size: 1em; color: rgb(0, 1=
91, 255);">()</span>
<span class=3D"lv6c" style=3D"font-size: 1em; color: rgb(0, 191, 255);">{</=
span>
default_movable test <span class=3D"op_lv6" style=3D"font-size: 1em; co=
lor: rgb(0, 191, 255);">=3D</span> test_default_movable_for_moving<span cla=
ss=3D"lv5c" style=3D"font-size: 1em; color: rgb(127, 255, 0);">()</span><sp=
an class=3D"op_lv6" style=3D"font-size: 1em; color: rgb(0, 191, 255);">;</s=
pan>
default_movable_r test_r <span class=3D"op_lv6" style=3D"font-size: 1em=
; color: rgb(0, 191, 255);">=3D</span> test_default_movable_r_for_moving<sp=
an class=3D"lv5c" style=3D"font-size: 1em; color: rgb(127, 255, 0);">()</sp=
an><span class=3D"op_lv6" style=3D"font-size: 1em; color: rgb(0, 191, 255);=
">;</span>
<span class=3D"lv6c" style=3D"font-size: 1em; color: rgb(0, 191, 255);">}</=
span></pre></div><div><br></div><div><b>confirmation</b>:</div><div> =
the first move to initialize <span style=3D"background-color: r=
gb(32, 32, 32); color: rgb(211, 211, 211); font-family: consolas, monospace=
;">test</span> in <span style=3D"color: rgb(211, 211, 211); font-=
family: consolas, monospace; background-color: rgb(32, 32, 32);">main</span=
> really transfer ownership of the handle and <span style=3D"back=
ground-color: rgb(32, 32, 32); color: rgb(211, 211, 211); font-family: cons=
olas, monospace;">FreeLibrary</span> is then called solely on end of s=
cope in <span style=3D"background-color: rgb(32, 32, 32); color: rgb(2=
11, 211, 211); font-family: consolas, monospace;">main</span> right?<b=
r></div><div><br></div><div><b>doubt</b>:</div><div> the secon=
d move to initialize <span style=3D"background-color: rgb(32, 32, 32);=
color: rgb(211, 211, 211); font-family: consolas, monospace;">test_r</span=
> in <span style=3D"color: rgb(211, 211, 211); font-family: conso=
las, monospace; background-color: rgb(32, 32, 32);">main</span> gives =
an error because the base class for <span style=3D"background-color: r=
gb(32, 32, 32); color: rgb(211, 211, 211); font-family: consolas, monospace=
;">unique_resource</span> is not movable because of implicitly deleted=
move constructor, so it can't be used is this context of ownership, hence =
the name change?</div><div> Is there a limitation for this mov=
e do not be allowed? (I guess if so, it must be highlighted in docs)</div><=
div><br></div><div>Regards,</div><div>Francisco Lopes</div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.<br />
To post to this group, send email to std-proposals@isocpp.org.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/?hl=3Den">http://groups.google.com/a/isocpp.org/group/std-pro=
posals/?hl=3Den</a>.<br />
<br />
<br />
------=_Part_257_18808073.1361028771870--
.
Author: DeadMG <wolfeinstein@gmail.com>
Date: Sat, 16 Feb 2013 08:11:24 -0800 (PST)
Raw View
------=_Part_98_3936464.1361031084375
Content-Type: text/plain; charset=ISO-8859-1
On Saturday, February 16, 2013 3:56:48 AM UTC, francisco.m...@oblita.com
wrote:
> Andrew Sandoval's reference implementation of his proposal is the single
> sane thing I've found to raii-manage resources that are referred by (very)
> common legacy opaque handles. I'm currently using it at my code.
>
> I've discussed at length my views of the current usage of smart pointers
> for this, it really doesn't fulfill my expectations / standards.
>
> I hope more motivations or reinforcement of the ones already exposed can
> be found here:
>
> http://stackoverflow.com/q/14878121
>
> http://stackoverflow.com/a/14902921
>
It does not help your case that sample implementations are a giant pile of
UB. Secondly, unique_ptr can already deal with opaque handles.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en.
------=_Part_98_3936464.1361031084375
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
On Saturday, February 16, 2013 3:56:48 AM UTC, francisco.m...@oblita.com wr=
ote:<br><blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0=
..8ex;border-left: 1px #ccc solid;padding-left: 1ex;">Andrew Sandoval's refe=
rence implementation of his proposal is the single sane thing I've found to=
raii-manage resources that are referred by (very) common legacy opaque han=
dles. I'm currently using it at my code.<br><div><br></div><div>I've discus=
sed at length my views of the current usage of smart pointers for this, it =
really doesn't fulfill my expectations / standards.</div><div><br></div><di=
v>I hope more motivations or reinforcement of the ones already exposed can =
be found here: </div><div><br></div><div><a href=3D"http://stackoverfl=
ow.com/q/14878121" target=3D"_blank">http://stackoverflow.com/q/<wbr>148781=
21</a><br></div><div><br></div><div><a href=3D"http://stackoverflow.com/a/1=
4902921" target=3D"_blank">http://stackoverflow.com/a/<wbr>14902921</a></di=
v></blockquote><div><br></div><div>It does not help your case that sample i=
mplementations are a giant pile of UB. Secondly, unique_ptr can already dea=
l with opaque handles.</div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.<br />
To post to this group, send email to std-proposals@isocpp.org.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/?hl=3Den">http://groups.google.com/a/isocpp.org/group/std-pro=
posals/?hl=3Den</a>.<br />
<br />
<br />
------=_Part_98_3936464.1361031084375--
.
Author: francisco.mailing.lists@oblita.com
Date: Sat, 16 Feb 2013 08:14:59 -0800 (PST)
Raw View
------=_Part_643_1838006.1361031299144
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Em s=E1bado, 16 de fevereiro de 2013 13h32min51s UTC-2,=20
francisco.m...@oblita.com escreveu:
> *confirmation*:
> the first move to initialize test in main really transfer ownership=
=20
> of the handle and FreeLibrary is then called solely on end of scope in=20
> main right?
>
Also, related to this, as a doubt in behavior:
std::scoped_resource<decltype(&FreeLibrary), HMODULE> module =3D std::m=
ake_scoped_resource(LoadLibrary("/foo/bar.so"), FreeLibrary, static_cast<HM=
ODULE>(nullptr));
std::scoped_resource<decltype(&FreeLibrary), HMODULE> module_copy =3D m=
odule;
Copy is allowed, not enforced move semantics like unique_ptr, I didn't get=
=20
this.
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/?hl=3Den.
------=_Part_643_1838006.1361031299144
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Em s=E1bado, 16 de fevereiro de 2013 13h32min51s UTC-2, francisco.m...@obli=
ta.com escreveu:<br><blockquote class=3D"gmail_quote" style=3D"margin: 0;m=
argin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div><b>c=
onfirmation</b>:<br></div><div> the first move to initialize&n=
bsp;<span style=3D"background-color:rgb(32,32,32);color:rgb(211,211,211);fo=
nt-family:consolas,monospace">test</span> in <span style=3D"color=
:rgb(211,211,211);font-family:consolas,monospace;background-color:rgb(32,32=
,32)">main</span> really transfer ownership of the handle and <sp=
an style=3D"background-color:rgb(32,32,32);color:rgb(211,211,211);font-fami=
ly:consolas,monospace">FreeLibrary</span> is then called solely on end=
of scope in <span style=3D"background-color:rgb(32,32,32);color:rgb(2=
11,211,211);font-family:consolas,monospace">main</span> right?</div></=
blockquote><div><br></div><div>Also, related to this, as a doubt in behavio=
r:</div><div><br></div><div><pre id=3D"vimCodeElement" style=3D"-webkit-fon=
t-smoothing: antialiased; font-family: consolas, monospace; color: rgb(211,=
211, 211); background-color: rgb(32, 32, 32);"> std<span class=3D"op_lv=
6" style=3D"font-size: 1em; color: rgb(0, 191, 255);">::</span>scoped_resou=
rce<span class=3D"lv5c" style=3D"font-size: 1em; color: rgb(127, 255, 0);">=
<</span><span class=3D"Statement" style=3D"font-size: 1em; color: rgb(12=
6, 138, 162);">decltype</span><span class=3D"lv4c" style=3D"font-size: 1em;=
color: rgb(255, 255, 0);">(</span><span class=3D"op_lv4" style=3D"font-siz=
e: 1em; color: rgb(255, 255, 0);">&</span>FreeLibrary<span class=3D"lv4=
c" style=3D"font-size: 1em; color: rgb(255, 255, 0);">)</span><span class=
=3D"op_lv5" style=3D"font-size: 1em; color: rgb(127, 255, 0);">,</span> HMO=
DULE<span class=3D"lv5c" style=3D"font-size: 1em; color: rgb(127, 255, 0);"=
>></span> module <span class=3D"op_lv6" style=3D"font-size: 1em; color: =
rgb(0, 191, 255);">=3D</span> std<span class=3D"op_lv6" style=3D"font-size:=
1em; color: rgb(0, 191, 255);">::</span>make_scoped_resource<span class=3D=
"lv5c" style=3D"font-size: 1em; color: rgb(127, 255, 0);">(</span>LoadLibra=
ry<span class=3D"lv4c" style=3D"font-size: 1em; color: rgb(255, 255, 0);">(=
</span><span class=3D"String" style=3D"font-size: 1em; color: rgb(177, 214,=
49); font-style: italic;">"/foo/bar.so"</span><span class=3D"lv4c" style=
=3D"font-size: 1em; color: rgb(255, 255, 0);">)</span><span class=3D"op_lv5=
" style=3D"font-size: 1em; color: rgb(127, 255, 0);">,</span> FreeLibrary<s=
pan class=3D"op_lv5" style=3D"font-size: 1em; color: rgb(127, 255, 0);">,</=
span> <span class=3D"Statement" style=3D"font-size: 1em; color: rgb(126, 13=
8, 162);">static_cast</span><span class=3D"lv4c" style=3D"font-size: 1em; c=
olor: rgb(255, 255, 0);"><</span>HMODULE<span class=3D"lv4c" style=3D"fo=
nt-size: 1em; color: rgb(255, 255, 0);">>(</span><span class=3D"Number" =
style=3D"font-size: 1em; color: rgb(255, 152, 0);">nullptr</span><span clas=
s=3D"lv4c" style=3D"font-size: 1em; color: rgb(255, 255, 0);">)</span><span=
class=3D"lv5c" style=3D"font-size: 1em; color: rgb(127, 255, 0);">)</span>=
<span class=3D"op_lv6" style=3D"font-size: 1em; color: rgb(0, 191, 255);">;=
</span>
std<span class=3D"op_lv6" style=3D"font-size: 1em; color: rgb(0, 191, 2=
55);">::</span>scoped_resource<span class=3D"lv5c" style=3D"font-size: 1em;=
color: rgb(127, 255, 0);"><</span><span class=3D"Statement" style=3D"fo=
nt-size: 1em; color: rgb(126, 138, 162);">decltype</span><span class=3D"lv4=
c" style=3D"font-size: 1em; color: rgb(255, 255, 0);">(</span><span class=
=3D"op_lv4" style=3D"font-size: 1em; color: rgb(255, 255, 0);">&</span>=
FreeLibrary<span class=3D"lv4c" style=3D"font-size: 1em; color: rgb(255, 25=
5, 0);">)</span><span class=3D"op_lv5" style=3D"font-size: 1em; color: rgb(=
127, 255, 0);">,</span> HMODULE<span class=3D"lv5c" style=3D"font-size: 1em=
; color: rgb(127, 255, 0);">></span> module_copy <span class=3D"op_lv6" =
style=3D"font-size: 1em; color: rgb(0, 191, 255);">=3D</span> module<span c=
lass=3D"op_lv6" style=3D"font-size: 1em; color: rgb(0, 191, 255);">;</span>=
</pre></div><div><br></div><div>Copy is allowed, not enforced move semantic=
s like unique_ptr, I didn't get this.</div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.<br />
To post to this group, send email to std-proposals@isocpp.org.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/?hl=3Den">http://groups.google.com/a/isocpp.org/group/std-pro=
posals/?hl=3Den</a>.<br />
<br />
<br />
------=_Part_643_1838006.1361031299144--
.
Author: francisco.mailing.lists@oblita.com
Date: Sat, 16 Feb 2013 08:20:40 -0800 (PST)
Raw View
------=_Part_606_32068946.1361031640660
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Em s=E1bado, 16 de fevereiro de 2013 14h11min24s UTC-2, DeadMG escreveu:
> It does not help your case that sample implementations are a giant pile o=
f=20
> UB. Secondly, unique_ptr can already deal with opaque handles.
ok, through tricks? through non-uniformity in syntax by requiring little=20
wrappers around it?
It doesn't help your case too, if you didn't show how unique_ptr can deal=
=20
naturally with the bullets I've pointed about *handle semantics*, which I=
=20
think are pretty fair.
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/?hl=3Den.
------=_Part_606_32068946.1361031640660
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Em s=E1bado, 16 de fevereiro de 2013 14h11min24s UTC-2, DeadMG escreveu:<b=
r><blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;b=
order-left: 1px #ccc solid;padding-left: 1ex;">It does not help your case t=
hat sample implementations are a giant pile of UB. Secondly, unique_ptr can=
already deal with opaque handles.</blockquote><div><br></div><div>ok, thro=
ugh tricks? through non-uniformity in syntax by requiring little wrappers a=
round it?</div><div><br></div><div>It doesn't help your case too, if you di=
dn't show how unique_ptr can deal naturally with the bullets I've pointed a=
bout <i>handle semantics</i>, which I think are pretty fair.</div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.<br />
To post to this group, send email to std-proposals@isocpp.org.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/?hl=3Den">http://groups.google.com/a/isocpp.org/group/std-pro=
posals/?hl=3Den</a>.<br />
<br />
<br />
------=_Part_606_32068946.1361031640660--
.
Author: DeadMG <wolfeinstein@gmail.com>
Date: Sat, 16 Feb 2013 12:08:23 -0800 (PST)
Raw View
------=_Part_959_26311547.1361045303041
Content-Type: text/plain; charset=ISO-8859-1
No, you can simply pass in a custom deleter. At the beginning of this very
topic, I showed this<https://groups.google.com/a/isocpp.org/d/msg/std-proposals/ValAPoPFeTw/uEEjb8GBOmwJ>,
which was only my first attempt. It can work just fine with HMODULEs and
HANDLEs and even POSIX file descriptors. You can alter it to take the null
value at runtime or whatever you desire. The point is that by customizing
the deleter, then unique_ptr can perfectly well serve the needs of *any*
resource ownership, even if it isn't a traditional pointer type.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en.
------=_Part_959_26311547.1361045303041
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
No, you can simply pass in a custom deleter. At the beginning of this very =
topic, I showed <a href=3D"https://groups.google.com/a/isocpp.org/d/ms=
g/std-proposals/ValAPoPFeTw/uEEjb8GBOmwJ">this</a>, which was only my first=
attempt. It can work just fine with HMODULEs and HANDLEs and even POSIX fi=
le descriptors. You can alter it to take the null value at runtime or whate=
ver you desire. The point is that by customizing the deleter, then unique_p=
tr can perfectly well serve the needs of *any* resource ownership, even if =
it isn't a traditional pointer type.
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.<br />
To post to this group, send email to std-proposals@isocpp.org.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/?hl=3Den">http://groups.google.com/a/isocpp.org/group/std-pro=
posals/?hl=3Den</a>.<br />
<br />
<br />
------=_Part_959_26311547.1361045303041--
.
Author: Ville Voutilainen <ville.voutilainen@gmail.com>
Date: Sat, 16 Feb 2013 22:14:12 +0200
Raw View
On 16 February 2013 22:08, DeadMG <wolfeinstein@gmail.com> wrote:
> No, you can simply pass in a custom deleter. At the beginning of this very
> topic, I showed this, which was only my first attempt. It can work just fine
> with HMODULEs and HANDLEs and even POSIX file descriptors. You can alter it
> to take the null value at runtime or whatever you desire. The point is that
> by customizing the deleter, then unique_ptr can perfectly well serve the
> needs of *any* resource ownership, even if it isn't a traditional pointer
> type.
Except that unique_ptr can't construct itself from a non-pointer handle type.
For such cases, it can achieve resource-releasing-is-destruction, but not
the full raii. That's why people are proposing an even-more-general resource
handle, unique_ptr doesn't cut it.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en.
.
Author: DeadMG <wolfeinstein@gmail.com>
Date: Sat, 16 Feb 2013 12:15:06 -0800 (PST)
Raw View
------=_Part_720_27355439.1361045706908
Content-Type: text/plain; charset=ISO-8859-1
It absolutely can do that if the deleter::pointer supports such a
construction.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en.
------=_Part_720_27355439.1361045706908
Content-Type: text/html; charset=ISO-8859-1
It absolutely can do that if the deleter::pointer supports such a construction.
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.<br />
To post to this group, send email to std-proposals@isocpp.org.<br />
Visit this group at <a href="http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en">http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en</a>.<br />
<br />
<br />
------=_Part_720_27355439.1361045706908--
.
Author: Ville Voutilainen <ville.voutilainen@gmail.com>
Date: Sat, 16 Feb 2013 22:17:27 +0200
Raw View
On 16 February 2013 22:15, DeadMG <wolfeinstein@gmail.com> wrote:
> It absolutely can do that if the deleter::pointer supports such a
> construction.
Sure, it can do that. But at that point it's no longer as simple to
use as a raii wrapper
with a destruction-lambda is.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en.
.
Author: DeadMG <wolfeinstein@gmail.com>
Date: Sat, 16 Feb 2013 12:23:50 -0800 (PST)
Raw View
------=_Part_242_27829712.1361046230470
Content-Type: text/plain; charset=ISO-8859-1
Why not? The only thing different right now is that you state T twice, and
that can be trivially fixed with a template alias.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en.
------=_Part_242_27829712.1361046230470
Content-Type: text/html; charset=ISO-8859-1
Why not? The only thing different right now is that you state T twice, and that can be trivially fixed with a template alias.
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.<br />
To post to this group, send email to std-proposals@isocpp.org.<br />
Visit this group at <a href="http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en">http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en</a>.<br />
<br />
<br />
------=_Part_242_27829712.1361046230470--
.
Author: Ville Voutilainen <ville.voutilainen@gmail.com>
Date: Sat, 16 Feb 2013 22:29:46 +0200
Raw View
On 16 February 2013 22:23, DeadMG <wolfeinstein@gmail.com> wrote:
> Why not? The only thing different right now is that you state T twice, and
> that can be trivially fixed with a template alias.
I need to state the deleter type. I fail to see how that's trivial,
and I fail to
see how having to write that alias is trivial either.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en.
.
Author: DeadMG <wolfeinstein@gmail.com>
Date: Sat, 16 Feb 2013 12:35:03 -0800 (PST)
Raw View
------=_Part_920_2885195.1361046903174
Content-Type: text/plain; charset=ISO-8859-1
It's the grand total of
template<typename T, typename Deleter, Deleter D, T null_value = T{}> using
unique_handle = unique_ptr<T, value_deleter<T, Deleter, D, null_value>>;
And if you want to deploy one of those horrific macros to give the deleter
type from the function pointer, you totally can- unique_resource is just
the same as unique_ptr in this respect.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en.
------=_Part_920_2885195.1361046903174
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
It's the grand total of<div><br></div><div>template<typename T, typename=
Deleter, Deleter D, T null_value =3D T{}> using unique_handle =3D uniqu=
e_ptr<T, value_deleter<T, Deleter, D, null_value>>;</div><div><=
br></div><div>And if you want to deploy one of those horrific macros to giv=
e the deleter type from the function pointer, you totally can- unique_resou=
rce is just the same as unique_ptr in this respect.</div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.<br />
To post to this group, send email to std-proposals@isocpp.org.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/?hl=3Den">http://groups.google.com/a/isocpp.org/group/std-pro=
posals/?hl=3Den</a>.<br />
<br />
<br />
------=_Part_920_2885195.1361046903174--
.
Author: francisco.mailing.lists@oblita.com
Date: Sat, 16 Feb 2013 12:52:59 -0800 (PST)
Raw View
------=_Part_326_24927194.1361047979095
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Em s=E1bado, 16 de fevereiro de 2013 18h35min03s UTC-2, DeadMG escreveu:
> It's the grand total of
>
> template<typename T, typename Deleter, Deleter D, T null_value =3D T{}>=
=20
> using unique_handle =3D unique_ptr<T, value_deleter<T, Deleter, D,=20
> null_value>>;
>
> And if you want to deploy one of those horrific macros to give the delete=
r=20
> type from the function pointer, you totally can- unique_resource is just=
=20
> the same as unique_ptr in this respect.
>
All of this, looks to me, just like an impressive preamble to have RAII for=
=20
a trivial situation.=20
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/?hl=3Den.
------=_Part_326_24927194.1361047979095
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Em s=E1bado, 16 de fevereiro de 2013 18h35min03s UTC-2, DeadMG escreveu:<b=
r><blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;b=
order-left: 1px #ccc solid;padding-left: 1ex;">It's the grand total of<div>=
<br></div><div>template<typename T, typename Deleter, Deleter D, T null_=
value =3D T{}> using unique_handle =3D unique_ptr<T, value_deleter<=
;T, Deleter, D, null_value>>;</div><div><br></div><div>And if you wan=
t to deploy one of those horrific macros to give the deleter type from the =
function pointer, you totally can- unique_resource is just the same as uniq=
ue_ptr in this respect.</div></blockquote><div><br></div><div>All of this, =
looks to me, just like an impressive preamble to have RAII for a trivial si=
tuation. </div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.<br />
To post to this group, send email to std-proposals@isocpp.org.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/?hl=3Den">http://groups.google.com/a/isocpp.org/group/std-pro=
posals/?hl=3Den</a>.<br />
<br />
<br />
------=_Part_326_24927194.1361047979095--
.
Author: DeadMG <wolfeinstein@gmail.com>
Date: Sat, 16 Feb 2013 13:06:49 -0800 (PST)
Raw View
------=_Part_819_25351898.1361048809873
Content-Type: text/plain; charset=ISO-8859-1
It's far less than the effort involved in unique_resource, and comes with
the existing Standard. There is no reason for the Committee to spend time
on a class which can only do what another class can already do better.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en.
------=_Part_819_25351898.1361048809873
Content-Type: text/html; charset=ISO-8859-1
It's far less than the effort involved in unique_resource, and comes with the existing Standard. There is no reason for the Committee to spend time on a class which can only do what another class can already do better.
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.<br />
To post to this group, send email to std-proposals@isocpp.org.<br />
Visit this group at <a href="http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en">http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en</a>.<br />
<br />
<br />
------=_Part_819_25351898.1361048809873--
.
Author: francisco.mailing.lists@oblita.com
Date: Sat, 16 Feb 2013 13:13:02 -0800 (PST)
Raw View
------=_Part_273_27189439.1361049182416
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Em s=E1bado, 16 de fevereiro de 2013 19h06min49s UTC-2, DeadMG escreveu:
> It's far less than the effort involved in unique_resource, and comes with=
=20
> the existing Standard. There is no reason for the Committee to spend time=
=20
> on a class which can only do what another class can already do better.
I thought the new status quo was also about turning things easer, more=20
natural to do *for the user*. I imagine a tentative of presenting C++ RAII=
=20
for a beginner, manipulating *handles*, since he may be using some C API.=
=20
Going all the way to explain why he needs to create a custom deleter and=20
long templates, all, to have his simple *handle* and resource releasing=20
function, just that, raii-managed.
Is that *doing better*? Not in my opinion.
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/?hl=3Den.
------=_Part_273_27189439.1361049182416
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Em s=E1bado, 16 de fevereiro de 2013 19h06min49s UTC-2, DeadMG escreveu:<b=
r><blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;b=
order-left: 1px #ccc solid;padding-left: 1ex;">It's far less than the effor=
t involved in unique_resource, and comes with the existing Standard. There =
is no reason for the Committee to spend time on a class which can only do w=
hat another class can already do better.</blockquote><div><br></div><div>I =
thought the new status quo was also about turning things easer, more natura=
l to do <i><b>for the user</b></i>. I imagine a tentative of presenting C++=
RAII for a beginner, manipulating <i>handles</i>, since he may be usi=
ng some C API. Going all the way to explain why he needs to create a custom=
deleter and long templates, all, to have his simple <i>handle</i> and reso=
urce releasing function, just that, raii-managed.</div><div><br></div><div>=
Is that <i>doing better</i>? Not in my opinion.</div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.<br />
To post to this group, send email to std-proposals@isocpp.org.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/?hl=3Den">http://groups.google.com/a/isocpp.org/group/std-pro=
posals/?hl=3Den</a>.<br />
<br />
<br />
------=_Part_273_27189439.1361049182416--
.
Author: francisco.mailing.lists@oblita.com
Date: Sat, 16 Feb 2013 13:35:06 -0800 (PST)
Raw View
------=_Part_837_26710183.1361050506470
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Em s=E1bado, 16 de fevereiro de 2013 19h13min02s UTC-2,=20
francisco.m...@oblita.com escreveu:
> Em s=E1bado, 16 de fevereiro de 2013 19h06min49s UTC-2, DeadMG escreveu:
>
>> It's far less than the effort involved in unique_resource, and comes wit=
h=20
>> the existing Standard. There is no reason for the Committee to spend tim=
e=20
>> on a class which can only do what another class can already do better.
>
>
> I thought the new status quo was also about turning things easer, more=20
> natural to do *for the user*. I imagine a tentative of presenting C++=20
> RAII for a beginner, manipulating *handles*, since he may be using some C=
=20
> API. Going all the way to explain why he needs to create a custom deleter=
=20
> and long templates, all, to have his simple *handle* and resource=20
> releasing function, just that, raii-managed.
>
> Is that *doing better*? Not in my opinion.
>
I really don't mind where such consistent and natural functionality may=20
fall, if ever, in the standard library. But one thing I'm absolutely sure,=
=20
if not the standard library, someone else will wrap this up and people will=
=20
make use of it instead of *doing better* by themselves all the time.
Generally, programmers don't like to repeat themselves implementing obvious=
=20
functionally.
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/?hl=3Den.
------=_Part_837_26710183.1361050506470
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Em s=E1bado, 16 de fevereiro de 2013 19h13min02s UTC-2, francisco.m...@obli=
ta.com escreveu:<br><blockquote class=3D"gmail_quote" style=3D"margin: 0;m=
argin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;">Em s=E1ba=
do, 16 de fevereiro de 2013 19h06min49s UTC-2, DeadMG escreveu:<br><blockq=
uote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-left:=
1px #ccc solid;padding-left:1ex">It's far less than the effort involved in =
unique_resource, and comes with the existing Standard. There is no reason f=
or the Committee to spend time on a class which can only do what another cl=
ass can already do better.</blockquote><div><br></div><div>I thought the ne=
w status quo was also about turning things easer, more natural to do <i><b>=
for the user</b></i>. I imagine a tentative of presenting C++ RAII for a be=
ginner, manipulating <i>handles</i>, since he may be using some C API.=
Going all the way to explain why he needs to create a custom deleter and l=
ong templates, all, to have his simple <i>handle</i> and resource releasing=
function, just that, raii-managed.</div><div><br></div><div>Is that <i>doi=
ng better</i>? Not in my opinion.</div></blockquote><div><br></div><div>I r=
eally don't mind where such consistent and natural functionality may fall, =
if ever, in the standard library. But one thing I'm absolutely sure, if not=
the standard library, someone else will wrap this up and people will make =
use of it instead of <i>doing better</i> by themselves all the time.</div><=
div><br></div><div>Generally, programmers don't like to repeat themselves i=
mplementing obvious functionally.</div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.<br />
To post to this group, send email to std-proposals@isocpp.org.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/?hl=3Den">http://groups.google.com/a/isocpp.org/group/std-pro=
posals/?hl=3Den</a>.<br />
<br />
<br />
------=_Part_837_26710183.1361050506470--
.
Author: DeadMG <wolfeinstein@gmail.com>
Date: Sat, 16 Feb 2013 13:57:09 -0800 (PST)
Raw View
------=_Part_334_5602814.1361051829541
Content-Type: text/plain; charset=ISO-8859-1
Well, let me see. For one, it's not a long template at all, it's actually
exceedingly short and simple. It's *basic* C++. Secondly, everybody should
be in the habit of using the Standard classes maximally flexibly- why don't
you complain that you have to actually type things to pass a custom
comparator to std::map?
And finally, if the terrible tiny smidge of custom functionality bothers
you so much, why don't you just Standardise value_deleter and unique_handle
as I've defined them here, and eliminate unique_resource and all the rest
because there's absolutely no need for them to exist?
Generally, programmers don't like to repeat themselves implementing obvious
> functionally.
You mean like, how *this entire proposal* is a duplicate of unique_ptr, but
worse?
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en.
------=_Part_334_5602814.1361051829541
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Well, let me see. For one, it's not a long template at all, it's actually e=
xceedingly short and simple. It's <i>basic</i> C++. Secondly, everybody sho=
uld be in the habit of using the Standard classes maximally flexibly- why d=
on't you complain that you have to actually type things to pass a custom co=
mparator to std::map?<div><br></div><div>And finally, if the terrible tiny =
smidge of custom functionality bothers you so much, why don't you just Stan=
dardise value_deleter and unique_handle as I've defined them here, and elim=
inate unique_resource and all the rest because there's absolutely no need f=
or them to exist? </div><div><br></div><blockquote class=3D"gmail_quot=
e" style=3D"margin: 0px 0px 0px 0.8ex; border-left-width: 1px; border-left-=
color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex;">Ge=
nerally, programmers don't like to repeat themselves implementing obvious f=
unctionally.</blockquote><div><br></div><div>You mean like, how <i>this ent=
ire proposal</i> is a duplicate of unique_ptr, but worse? </div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.<br />
To post to this group, send email to std-proposals@isocpp.org.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/?hl=3Den">http://groups.google.com/a/isocpp.org/group/std-pro=
posals/?hl=3Den</a>.<br />
<br />
<br />
------=_Part_334_5602814.1361051829541--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Sat, 16 Feb 2013 14:15:42 -0800 (PST)
Raw View
------=_Part_674_3619463.1361052943173
Content-Type: text/plain; charset=ISO-8859-1
On Saturday, February 16, 2013 12:08:23 PM UTC-8, DeadMG wrote:
>
> No, you can simply pass in a custom deleter. At the beginning of this very
> topic, I showed this<https://groups.google.com/a/isocpp.org/d/msg/std-proposals/ValAPoPFeTw/uEEjb8GBOmwJ>,
> which was only my first attempt. It can work just fine with HMODULEs and
> HANDLEs and even POSIX file descriptors. You can alter it to take the null
> value at runtime or whatever you desire. The point is that by customizing
> the deleter, then unique_ptr can perfectly well serve the needs of *any*
> resource ownership, even if it isn't a traditional pointer type.
If you have to write a wrapper for your type... why not just write a
wrapper *instead* of unique_ptr? What's the difference? Why do we have to
shoehorn things that obviously aren't intended to go into unique_ptr into
unique_ptr?
Think about it. `unique_ptr` offers `operator->`. Which you will never use
for objects that don't point to other things. So... why is it there?
Because `unique_ptr` is meant for *pointers* and other pointer-like things.
A handle is not a pointer. The API for a `unique_handle` or whatever will
actually fit the concept. The *name* won't be misleading, as you have to
explain to people why you're throwing non-pointer things into something
called `unique_*ptr*`.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en.
------=_Part_674_3619463.1361052943173
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
On Saturday, February 16, 2013 12:08:23 PM UTC-8, DeadMG wrote:<blockquote =
class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1p=
x #ccc solid;padding-left: 1ex;">No, you can simply pass in a custom delete=
r. At the beginning of this very topic, I showed <a href=3D"https://gr=
oups.google.com/a/isocpp.org/d/msg/std-proposals/ValAPoPFeTw/uEEjb8GBOmwJ" =
target=3D"_blank">this</a>, which was only my first attempt. It can work ju=
st fine with HMODULEs and HANDLEs and even POSIX file descriptors. You can =
alter it to take the null value at runtime or whatever you desire. The poin=
t is that by customizing the deleter, then unique_ptr can perfectly well se=
rve the needs of *any* resource ownership, even if it isn't a traditional p=
ointer type.</blockquote><div><br>If you have to write a wrapper for your t=
ype... why not just write a wrapper <i>instead</i> of unique_ptr? What's th=
e difference? Why do we have to shoehorn things that obviously aren't inten=
ded to go into unique_ptr into unique_ptr?<br><br>Think about it. `unique_p=
tr` offers `operator->`. Which you will never use for objects that don't=
point to other things. So... why is it there? Because `unique_ptr` is mean=
t for <i>pointers</i> and other pointer-like things.<br><br>A handle is not=
a pointer. The API for a `unique_handle` or whatever will actually fit the=
concept. The <i>name</i> won't be misleading, as you have to explain to pe=
ople why you're throwing non-pointer things into something called `unique_<=
b>ptr</b>`.<br></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.<br />
To post to this group, send email to std-proposals@isocpp.org.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/?hl=3Den">http://groups.google.com/a/isocpp.org/group/std-pro=
posals/?hl=3Den</a>.<br />
<br />
<br />
------=_Part_674_3619463.1361052943173--
.
Author: DeadMG <wolfeinstein@gmail.com>
Date: Sat, 16 Feb 2013 15:24:49 -0800 (PST)
Raw View
------=_Part_1064_29318824.1361057089266
Content-Type: text/plain; charset=ISO-8859-1
Firstly, screw what it's meant for. It is perfectly capable of serving this
purpose in every way. Templates were never meant to be Turing-Complete, and
we were never meant to use expression templates, and Alexander Fleming
never meant to discover antibiotics. But that never stopped them from
happening, and being good or bad things irrelevant of whether or not they
were meant to happen.
And secondly, the authors of unique_ptr *meant* for it to be customizable
with the pointer typedef. If it was only meant for use with raw pointers...
why offer the typedef?
If you have to write a wrapper for your type
It is not a wrapper any more than a std::map with std::greater as a
comparator is a wrapper. It is a customization using the provided extension
point.
why not just write a wrapper *instead* of unique_ptr
Probably because the wrapper would be virtually entirely a duplicate of
unique_ptr in both interface and implementation, and be far larger, more
complex, and more confusing (due to the massive redundancy) than simply
using the provided extension point.
A handle is not a pointer.
A handle is exactly a pointer, just with a non-pointer implementation.
Which you will never use for objects that don't point to other things.
> So... why is it there?
Because you *can* use it *if* it is a pointer. It is not mandatory. Why
does std::vector offer a copy constructor, if you're meant to store
non-copyable objects in it? If reflection passes, it may even be possible
to implement operator->. There's no other reason why operator-> can't be
implemented except that it would have to be done manually per-type.
The API for a `unique_handle` or whatever will actually fit the concept.
The API for unique_resource, as far as I can see, is basically exactly
identical to unique_ptr, except that it won't be compatible with existing
code using unique_ptr, like the std::hash specialization. The
implementation (and specification) will be an utter waste.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en.
------=_Part_1064_29318824.1361057089266
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Firstly, screw what it's meant for. It is perfectly capable of serving this=
purpose in every way. Templates were never meant to be Turing-Complete, an=
d we were never meant to use expression templates, and Alexander Fleming ne=
ver meant to discover antibiotics. But that never stopped them from happeni=
ng, and being good or bad things irrelevant of whether or not they were mea=
nt to happen.<div>And secondly, the authors of unique_ptr <i>meant</i>=
for it to be customizable with the pointer typedef. If it was only me=
ant for use with raw pointers... why offer the typedef?<br><div><br></div><=
blockquote class=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; border=
-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style:=
solid; padding-left: 1ex;">If you have to write a wrapper for your type</b=
lockquote><div><br></div><div>It is not a wrapper any more than a std::map =
with std::greater as a comparator is a wrapper. It is a customization using=
the provided extension point.</div><div><br></div><blockquote class=3D"gma=
il_quote" style=3D"margin: 0px 0px 0px 0.8ex; border-left-width: 1px; borde=
r-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1=
ex;">why not just write a wrapper <i>instead</i> of unique_ptr</b=
lockquote><div><br></div><div>Probably because the wrapper would be virtual=
ly entirely a duplicate of unique_ptr in both interface and implementation,=
and be far larger, more complex, and more confusing (due to the massive re=
dundancy) than simply using the provided extension point.</div><div><br></d=
iv><blockquote class=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; bo=
rder-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-st=
yle: solid; padding-left: 1ex;"> A handle is not a pointer.</blockquot=
e><div><br></div><div>A handle is exactly a pointer, just with a non-pointe=
r implementation.</div></div><div><br></div><blockquote class=3D"gmail_quot=
e" style=3D"margin: 0px 0px 0px 0.8ex; border-left-width: 1px; border-left-=
color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex;">Wh=
ich you will never use for objects that don't point to other things. So... =
why is it there?</blockquote><div><br></div><div>Because you <i>can</i=
> use it <i>if</i> it is a pointer. It is not mandatory. Why=
does std::vector offer a copy constructor, if you're meant to store non-co=
pyable objects in it? If reflection passes, it may even be possible to impl=
ement operator->. There's no other reason why operator-> can't be imp=
lemented except that it would have to be done manually per-type.</div><div>=
<br></div><blockquote class=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.=
8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-=
left-style: solid; padding-left: 1ex;">The API for a `unique_handle` or wha=
tever will actually fit the concept.</blockquote><div><br></div><div>The AP=
I for unique_resource, as far as I can see, is basically exactly identical =
to unique_ptr, except that it won't be compatible with existing code using =
unique_ptr, like the std::hash specialization. The implementation (and spec=
ification) will be an utter waste.</div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.<br />
To post to this group, send email to std-proposals@isocpp.org.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/?hl=3Den">http://groups.google.com/a/isocpp.org/group/std-pro=
posals/?hl=3Den</a>.<br />
<br />
<br />
------=_Part_1064_29318824.1361057089266--
.
Author: Ville Voutilainen <ville.voutilainen@gmail.com>
Date: Sun, 17 Feb 2013 01:33:41 +0200
Raw View
On 17 February 2013 01:24, DeadMG <wolfeinstein@gmail.com> wrote:
> Firstly, screw what it's meant for. It is perfectly capable of serving th=
is
> purpose in every way. Templates were never meant to be Turing-Complete, a=
nd
For your interesting definition of "perfect" and "every", perhaps so.
Compared to being able to write something like
auto x =3D make_unique_handle<int>([](auto h)=A0{fclose(h);}, fopen("blah")=
);
I see something that's far from perfect in every way in unique_ptr,
custom deleters
or not.
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/?hl=3Den.
.
Author: DeadMG <wolfeinstein@gmail.com>
Date: Sat, 16 Feb 2013 15:35:53 -0800 (PST)
Raw View
------=_Part_679_21627758.1361057753350
Content-Type: text/plain; charset=ISO-8859-1
Implementing that function does not require unique_handle or, indeed,
unique_resource or any other of the proposed classes. It can be implemented
just fine on top of the custom deleter (although I made mine to fit
unique_resource which was constexpr, not run-time, but that's a fairly
trivial modification).
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en.
------=_Part_679_21627758.1361057753350
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Implementing that function does not require unique_handle or, indeed, uniqu=
e_resource or any other of the proposed classes. It can be implemented just=
fine on top of the custom deleter (although I made mine to fit unique_reso=
urce which was constexpr, not run-time, but that's a fairly trivial modific=
ation).
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.<br />
To post to this group, send email to std-proposals@isocpp.org.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/?hl=3Den">http://groups.google.com/a/isocpp.org/group/std-pro=
posals/?hl=3Den</a>.<br />
<br />
<br />
------=_Part_679_21627758.1361057753350--
.
Author: Ville Voutilainen <ville.voutilainen@gmail.com>
Date: Sun, 17 Feb 2013 01:38:19 +0200
Raw View
On 17 February 2013 01:35, DeadMG <wolfeinstein@gmail.com> wrote:
> Implementing that function does not require unique_handle or, indeed,
> unique_resource or any other of the proposed classes. It can be implemented
> just fine on top of the custom deleter (although I made mine to fit
> unique_resource which was constexpr, not run-time, but that's a fairly
> trivial modification).
Then perhaps that's what we should strive for specifying, rather than
a new set of resource-handling
classes.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en.
.
Author: DeadMG <wolfeinstein@gmail.com>
Date: Sat, 16 Feb 2013 15:45:57 -0800 (PST)
Raw View
------=_Part_982_11578358.1361058357845
Content-Type: text/plain; charset=ISO-8859-1
Yeah. As I've been saying all along, I don't fundamentally feel that
something like unique_handle and make_unique_handle to natively deal with C
handles directly are bad ideas. But there is no reason to implement them
any way but on top of unique_ptr or specify a whole bunch of
resource-handling classes.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en.
------=_Part_982_11578358.1361058357845
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Yeah. As I've been saying all along, I don't fundamentally feel that someth=
ing like unique_handle and make_unique_handle to natively deal with C handl=
es directly are bad ideas. But there is no reason to implement them any way=
but on top of unique_ptr or specify a whole bunch of resource-handling cla=
sses.
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.<br />
To post to this group, send email to std-proposals@isocpp.org.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/?hl=3Den">http://groups.google.com/a/isocpp.org/group/std-pro=
posals/?hl=3Den</a>.<br />
<br />
<br />
------=_Part_982_11578358.1361058357845--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Sat, 16 Feb 2013 16:12:12 -0800 (PST)
Raw View
------=_Part_287_16777323.1361059932799
Content-Type: text/plain; charset=ISO-8859-1
On Saturday, February 16, 2013 3:24:49 PM UTC-8, DeadMG wrote:
>
> Firstly, screw what it's meant for. It is perfectly capable of serving
> this purpose in every way. Templates were never meant to be
> Turing-Complete, and we were never meant to use expression templates, and
> Alexander Fleming never meant to discover antibiotics. But that never
> stopped them from happening, and being good or bad things irrelevant of
> whether or not they were meant to happen.
> And secondly, the authors of unique_ptr *meant* for it to be customizable
> with the pointer typedef. If it was only meant for use with raw pointers...
> why offer the typedef?
>
> If you have to write a wrapper for your type
>
>
> It is not a wrapper any more than a std::map with std::greater as a
> comparator is a wrapper. It is a customization using the provided extension
> point.
>
Your code has a `struct *wrapper*` in it. Which wraps the type. Therefore,
a wrapper is being employed. The fact that it's not explicit in the
`unique_ptr` signature is irrelevant; you still wrote a wrapper.
And a bad wrapper at that, since it assumes that there is such a thing as a
"null handle value". Which is not an assumption we should be making.
why not just write a wrapper *instead* of unique_ptr
>
>
> Probably because the wrapper would be virtually entirely a duplicate of
> unique_ptr in both interface and implementation, and be far larger, more
> complex, and more confusing (due to the massive redundancy) than simply
> using the provided extension point.
>
Massive redundancy of what? And no, it will not be a duplicate in interface
or implementation. Its equivalent of a `get` function won't return a
pointer, for example. It won't have an `operator->`. In short, it won't
look like `unique_ptr` at all, save for the fact that it is moveable.
`unique_handle` probably won't even have an "empty" member function.
A handle is not a pointer.
>
>
> A handle is exactly a pointer, just with a non-pointer implementation.
>
Are you being serious? An integer is not like a pointer. You can't
deference them, and you shouldn't want to. They don't have null values, and
you shouldn't pretend/assume otherwise.
> Which you will never use for objects that don't point to other things.
>> So... why is it there?
>
>
> Because you *can* use it *if* it is a pointer. It is not mandatory. Why
> does std::vector offer a copy constructor, if you're meant to store
> non-copyable objects in it? If reflection passes, it may even be possible
> to implement operator->. There's no other reason why operator-> can't be
> implemented except that it would have to be done manually per-type.
>
No reason besides *not wanting that interface*. Your assumption that people
actually want to treat a handle like a pointer is, quite frankly, absurd.
> The API for a `unique_handle` or whatever will actually fit the concept.
>
>
> The API for unique_resource, as far as I can see, is basically exactly
> identical to unique_ptr, except that it won't be compatible with existing
> code using unique_ptr, like the std::hash specialization. The
> implementation (and specification) will be an utter waste.
>
It *shouldn't* be compatible with existing code that uses unique_ptr.
Because it's *not* a pointer, and it should not behave as such.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en.
------=_Part_287_16777323.1361059932799
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
<br><br>On Saturday, February 16, 2013 3:24:49 PM UTC-8, DeadMG wrote:<bloc=
kquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-l=
eft: 1px #ccc solid;padding-left: 1ex;">Firstly, screw what it's meant for.=
It is perfectly capable of serving this purpose in every way. Templates we=
re never meant to be Turing-Complete, and we were never meant to use expres=
sion templates, and Alexander Fleming never meant to discover antibiotics. =
But that never stopped them from happening, and being good or bad things ir=
relevant of whether or not they were meant to happen.<div>And secondly, the=
authors of unique_ptr <i>meant</i> for it to be customizable wit=
h the pointer typedef. If it was only meant for use with raw pointers... wh=
y offer the typedef?<br><div><br></div><blockquote class=3D"gmail_quote" st=
yle=3D"margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb=
(204,204,204);border-left-style:solid;padding-left:1ex">If you have to writ=
e a wrapper for your type</blockquote><div><br></div><div>It is not a wrapp=
er any more than a std::map with std::greater as a comparator is a wrapper.=
It is a customization using the provided extension point.</div></div></blo=
ckquote><div><br>Your code has a `struct <b>wrapper</b>` in it. Which wraps=
the type. Therefore, a wrapper is being employed. The fact that it's not e=
xplicit in the `unique_ptr` signature is irrelevant; you still wrote a wrap=
per.<br><br>And a bad wrapper at that, since it assumes that there is such =
a thing as a "null handle value". Which is not an assumption we should be m=
aking.<br><br></div><blockquote class=3D"gmail_quote" style=3D"margin: 0;ma=
rgin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div><div>=
</div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;b=
order-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:s=
olid;padding-left:1ex">why not just write a wrapper <i>instead</i>&nbs=
p;of unique_ptr</blockquote><div><br></div><div>Probably because the wrappe=
r would be virtually entirely a duplicate of unique_ptr in both interface a=
nd implementation, and be far larger, more complex, and more confusing (due=
to the massive redundancy) than simply using the provided extension point.=
</div></div></blockquote><div><br>Massive redundancy of what? And no, it wi=
ll not be a duplicate in interface or implementation. Its equivalent of a `=
get` function won't return a pointer, for example. It won't have an `operat=
or->`. In short, it won't look like `unique_ptr` at all, save for the fa=
ct that it is moveable.<br><br>`unique_handle` probably won't even have an =
"empty" member function.<br><br></div><blockquote class=3D"gmail_quote" sty=
le=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left=
: 1ex;"><div><div></div><blockquote class=3D"gmail_quote" style=3D"margin:0=
px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);b=
order-left-style:solid;padding-left:1ex"> A handle is not a pointer.</=
blockquote><div><br></div><div>A handle is exactly a pointer, just with a n=
on-pointer implementation.</div></div></blockquote><div><br>Are you being s=
erious? An integer is not like a pointer. You can't deference them, and you=
shouldn't want to. They don't have null values, and you shouldn't pretend/=
assume otherwise.<br> </div><blockquote class=3D"gmail_quote" style=3D=
"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex=
;"><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;bord=
er-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:soli=
d;padding-left:1ex">Which you will never use for objects that don't point t=
o other things. So... why is it there?</blockquote><div><br></div><div>Beca=
use you <i>can</i> use it <i>if</i> it is a pointer. It=
is not mandatory. Why does std::vector offer a copy constructor, if you're=
meant to store non-copyable objects in it? If reflection passes, it may ev=
en be possible to implement operator->. There's no other reason why oper=
ator-> can't be implemented except that it would have to be done manuall=
y per-type.</div></blockquote><div><br>No reason besides <i>not wanting tha=
t interface</i>. Your assumption that people actually want to treat a handl=
e like a pointer is, quite frankly, absurd.<br> </div><blockquote clas=
s=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #c=
cc solid;padding-left: 1ex;"><blockquote class=3D"gmail_quote" style=3D"mar=
gin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,2=
04);border-left-style:solid;padding-left:1ex">The API for a `unique_handle`=
or whatever will actually fit the concept.</blockquote><div><br></div><div=
>The API for unique_resource, as far as I can see, is basically exactly ide=
ntical to unique_ptr, except that it won't be compatible with existing code=
using unique_ptr, like the std::hash specialization. The implementation (a=
nd specification) will be an utter waste.</div></blockquote><div><br>It <i>=
shouldn't</i> be compatible with existing code that uses unique_ptr. Becaus=
e it's <i>not</i> a pointer, and it should not behave as such.<br></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.<br />
To post to this group, send email to std-proposals@isocpp.org.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/?hl=3Den">http://groups.google.com/a/isocpp.org/group/std-pro=
posals/?hl=3Den</a>.<br />
<br />
<br />
------=_Part_287_16777323.1361059932799--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Sat, 16 Feb 2013 16:17:58 -0800 (PST)
Raw View
------=_Part_660_2938385.1361060278316
Content-Type: text/plain; charset=ISO-8859-1
On Saturday, February 16, 2013 3:45:57 PM UTC-8, DeadMG wrote:
>
> Yeah. As I've been saying all along, I don't fundamentally feel that
> something like unique_handle and make_unique_handle to natively deal with C
> handles directly are bad ideas. But there is no reason to implement them
> any way but on top of unique_ptr or specify a whole bunch of
> resource-handling classes.
I feel the burden of proof needs to go the other way, due to the inherent
nonsensical nature of using something named `_ptr` for non-pointer things.
And no, a template alias isn't going to change what the actual type really
is.
The only advantage you've stated is that you get to reuse existing APIs,
like std::hash. Except that's not much of an advantage, as most "existing
APIs" will expect your `unique_ptr` to be pointer-like. They can expect
that `std::remove_pointer<unique_ptr::pointer>::type` will actually
compile. Which it won't.
We should want people to support them separately because they are *separate
concepts*. They should have separate APIs, with separate function names,
construction, destruction, etc. In particular `unique_handle`s should not
be able to be *empty*.
Writing move constructors *is not hard.* What is there to be gained by not
creating a new type that, let's be honest, most C++ programmers could write
in a couple of minutes?
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en.
------=_Part_660_2938385.1361060278316
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
On Saturday, February 16, 2013 3:45:57 PM UTC-8, DeadMG wrote:<blockquote c=
lass=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px=
#ccc solid;padding-left: 1ex;">Yeah. As I've been saying all along, I don'=
t fundamentally feel that something like unique_handle and make_unique_hand=
le to natively deal with C handles directly are bad ideas. But there is no =
reason to implement them any way but on top of unique_ptr or specify a whol=
e bunch of resource-handling classes.</blockquote><div><br>I feel the burde=
n of proof needs to go the other way, due to the inherent nonsensical natur=
e of using something named `_ptr` for non-pointer things. And no, a templat=
e alias isn't going to change what the actual type really is.<br><br>The on=
ly advantage you've stated is that you get to reuse existing APIs, like std=
::hash. Except that's not much of an advantage, as most "existing APIs" wil=
l expect your `unique_ptr` to be pointer-like. They can expect that `std::r=
emove_pointer<unique_ptr::pointer>::type` will actually compile. Whic=
h it won't.<br><br>We should want people to support them separately because=
they are <i>separate concepts</i>. They should have separate APIs, with se=
parate function names, construction, destruction, etc. In particular `uniqu=
e_handle`s should not be able to be <i>empty</i>.<br><br>Writing move const=
ructors <i>is not hard.</i> What is there to be gained by not creating a ne=
w type that, let's be honest, most C++ programmers could write in a couple =
of minutes?<br></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.<br />
To post to this group, send email to std-proposals@isocpp.org.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/?hl=3Den">http://groups.google.com/a/isocpp.org/group/std-pro=
posals/?hl=3Den</a>.<br />
<br />
<br />
------=_Part_660_2938385.1361060278316--
.
Author: Andrew Sandoval <sandoval@netwaysglobal.com>
Date: Sat, 16 Feb 2013 16:41:54 -0800 (PST)
Raw View
------=_Part_1021_1815783.1361061714695
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
On Saturday, February 16, 2013 12:56:31 AM UTC-6, francisco.m...@oblita.com=
=20
wrote:
>
>
>
> Em s=E1bado, 16 de fevereiro de 2013 04h50min33s UTC-2, Nicol Bolas escre=
veu:
>>
>>
>>
>> On Friday, February 15, 2013 10:34:53 PM UTC-8, Andrew Sandoval wrote:
>>>
>>> On Friday, February 15, 2013 9:56:48 PM UTC-6, francisco.m...@oblita.co=
mwrote:
>>>>
>>>> Andrew Sandoval's reference implementation of his proposal is the=20
>>>> single sane thing I've found to raii-manage resources that are referre=
d by=20
>>>> (very) common legacy opaque handles. I'm currently using it at my code=
..
>>>>
>>>> I've discussed at length my views of the current usage of smart=20
>>>> pointers for this, it really doesn't fulfill my expectations / standar=
ds.
>>>>
>>>> I hope more motivations or reinforcement of the ones already exposed=
=20
>>>> can be found here:=20
>>>>
>>>> http://stackoverflow.com/q/14878121
>>>>
>>>> http://stackoverflow.com/a/14902921
>>>>
>>>> Thanks Francisco! FWIW, I've not given up on this proposal, I've just=
=20
>>> been overwhelmed with other work. I also didn't notice that I've been=
=20
>>> missing out on part of the conversation, until tonight...=20
>>>
>>> Anyway, as soon as I get caught up, I intend to work on finishing the=
=20
>>> first draft of the proposal. The "standardese" is very...time consumin=
g,=20
>>> and I may not be getting it right.
>>>
>>> As for the reference implementation, in consulting with others who are=
=20
>>> using it already, I think its good to go except that the name=20
>>> unique_resource should probably be auto_resource. I know there is some=
=20
>>> negative connotation associated with auto_ptr,
>>>
>>
>> It's not about negative connotations. It's about "that's what we call=20
>> single-ownership things now." It's about consistency in the API. We don'=
t=20
>> use auto_ptr anymore; it's deprecated. Therefore, if there's going to be=
an=20
>> object that encapsulates the concept of single-ownership of non-pointer=
=20
>> resources, it should be called "unique_*".
>>
>> Otherwise, it's a pointless inconsistency that gains the API nothing. If=
=20
>> people see `unique_resource` alongside `unique_ptr`, then the API looks=
=20
>> uniform. If they see `auto_resource` and `unique_ptr`, confusion results=
..=20
>> Especially when they do a search and find out that there's an `auto_ptr`=
..
>>
>
> I concur, what's the exact motivation for shifting the name to=20
> auto_resource?=20
>
I actually like unique_resource better myself, but the last time this topic=
=20
was hot there seemed to be too much objection to it. If that is not true I=
=20
will leave it alone.
At the moment I don't have time to get back into that argument of "why have=
=20
this at all?" Others seem to be doing a good job of defending it, for=20
which I am grateful. I suspect some of the negativity is really just 'this=
=20
isn't how I do things so nobody should', but I am completely confident that=
=20
these classes if made part of the standard library will improve code=20
quality where they are used. I've seen it enough times. And if someone=20
doesn't like them, they certainly don't need to use them. I take that=20
approach with many other parts of the library, without questioning the=20
intelligence or intentions of their inventors. :)
Yes, I know I can beat a unique_ptr into submission enough to make it work=
=20
for many things, and yes, some people -- even I, will use these RAII=20
classes in ways that others find "trivial", but there is a method to the=20
madness. Using RAII as a force of habit, and using classes that enable it,=
=20
improves code quality for numerous reasons that I've already listed more=20
than once. So again, thank you to those who are supporting this and=20
providing helpful feedback!
-Andrew Sandoval=20
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/?hl=3Den.
------=_Part_1021_1815783.1361061714695
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
On Saturday, February 16, 2013 12:56:31 AM UTC-6, francisco.m...@oblita.com=
wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.=
8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><br><br>Em s=E1bado, 16=
de fevereiro de 2013 04h50min33s UTC-2, Nicol Bolas escreveu:<blockquote =
class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-left:1px #=
ccc solid;padding-left:1ex"><br><br>On Friday, February 15, 2013 10:34:53 P=
M UTC-8, Andrew Sandoval wrote:<blockquote class=3D"gmail_quote" style=3D"m=
argin:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-left:1ex">On F=
riday, February 15, 2013 9:56:48 PM UTC-6, <a>francisco.m...@oblita.com</a>=
wrote:<blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8e=
x;border-left:1px #ccc solid;padding-left:1ex">Andrew Sandoval's reference =
implementation of his proposal is the single sane thing I've found to raii-=
manage resources that are referred by (very) common legacy opaque handles. =
I'm currently using it at my code.<br><div><br></div><div>I've discussed at=
length my views of the current usage of smart pointers for this, it really=
doesn't fulfill my expectations / standards.</div><div><br></div><div>I ho=
pe more motivations or reinforcement of the ones already exposed can be fou=
nd here: </div><div><br></div><div><a href=3D"http://stackoverflow.com=
/q/14878121" target=3D"_blank">http://stackoverflow.com/q/<wbr>14878121</a>=
<br></div><div><br></div><div><a href=3D"http://stackoverflow.com/a/1490292=
1" target=3D"_blank">http://stackoverflow.com/a/<wbr>14902921</a><br></div>=
<div><br></div></blockquote><div>Thanks Francisco! FWIW, I've not giv=
en up on this proposal, I've just been overwhelmed with other work. I=
also didn't notice that I've been missing out on part of the conversation,=
until tonight... <br><br>Anyway, as soon as I get caught up, I intend to w=
ork on finishing the first draft of the proposal. The "standardese" i=
s very...time consuming, and I may not be getting it right.<br><br>As for t=
he reference implementation, in consulting with others who are using it alr=
eady, I think its good to go except that the name unique_resource should pr=
obably be auto_resource. I know there is some negative connotation as=
sociated with auto_ptr,</div></blockquote><div><br>It's not about negative =
connotations. It's about "that's what we call single-ownership things now."=
It's about consistency in the API. We don't use auto_ptr anymore; it's dep=
recated. Therefore, if there's going to be an object that encapsulates the =
concept of single-ownership of non-pointer resources, it should be called "=
unique_*".<br><br>Otherwise, it's a pointless inconsistency that gains the =
API nothing. If people see `unique_resource` alongside `unique_ptr`, then t=
he API looks uniform. If they see `auto_resource` and `unique_ptr`, confusi=
on results. Especially when they do a search and find out that there's an `=
auto_ptr`.<br></div></blockquote><div><br></div><div>I concur, what's the e=
xact motivation for shifting the name to auto_resource? </div></blockq=
uote><div><br>I actually like unique_resource better myself, but the last t=
ime this topic was hot there seemed to be too much objection to it. I=
f that is not true I will leave it alone.<br><br>At the moment I don't have=
time to get back into that argument of "why have this at all?" Other=
s seem to be doing a good job of defending it, for which I am grateful.&nbs=
p; I suspect some of the negativity is really just 'this isn't how I do thi=
ngs so nobody should', but I am completely confident that these classes if =
made part of the standard library will improve code quality where they are =
used. I've seen it enough times. And if someone doesn't like th=
em, they certainly don't need to use them. I take that approach with =
many other parts of the library, without questioning the intelligence or in=
tentions of their inventors. :)<br><br>Yes, I know I can beat a unique_ptr =
into submission enough to make it work for many things, and yes, some peopl=
e -- even I, will use these RAII classes in ways that others find "trivial"=
, but there is a method to the madness. Using RAII as a force of habi=
t, and using classes that enable it, improves code quality for numerous rea=
sons that I've already listed more than once. So again, thank you to =
those who are supporting this and providing helpful feedback!<br><br>-Andre=
w Sandoval <br></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.<br />
To post to this group, send email to std-proposals@isocpp.org.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/?hl=3Den">http://groups.google.com/a/isocpp.org/group/std-pro=
posals/?hl=3Den</a>.<br />
<br />
<br />
------=_Part_1021_1815783.1361061714695--
.
Author: DeadMG <wolfeinstein@gmail.com>
Date: Sat, 16 Feb 2013 16:45:30 -0800 (PST)
Raw View
------=_Part_1013_4889038.1361061930273
Content-Type: text/plain; charset=ISO-8859-1
>
> Your code has a `struct *wrapper*` in it. Which wraps the type.
> Therefore, a wrapper is being employed. The fact that it's not explicit in
> the `unique_ptr` signature is irrelevant; you still wrote a wrapper.
> And a bad wrapper at that, since it assumes that there is such a thing as
> a "null handle value". Which is not an assumption we should be making.
It's an irrelevant implementation detail. Also, the proposed mechanism
*also* assumes "null handle value" *and* even if I didn't want to assume
that, then std::optional<T> would serve just fine.
Massive redundancy of what? And no, it will not be a duplicate in interface
> or implementation. Its equivalent of a `get` function won't return a
> pointer, for example. It won't have an `operator->`.
Neither does mine, on either count.
`unique_handle` probably won't even have an "empty" member function.
The proposal clearly indicates otherwise.
Are you being serious? An integer is not like a pointer. You can't
> deference them, and you shouldn't want to. They don't have null values, and
> you shouldn't pretend/assume otherwise.
You also can't de-reference many kinds of pointer- for example, you can't
meaningfully de-ref a function pointer, nor a pointer to an incomplete
type, or a void pointer. Again, the proposal clearly calls for nullability
and even if it didn't, std::optional would act fine here. In any case, you *
can *dereference the unique_ptr with the deleter I have described, and the
semantics mirror those of other kinds of pointer.
A handle and a pointer *are* the same concept. They are an object whose
sole purpose is to uniquely identify and provide access to some other
object. That is why they can share the same interface.
The only advantage you've stated is that you get to reuse existing APIs,
> like std::hash
How about massively simpler design, specification, and implementation? The
Committee could spend their time fixing actual problems or introducing real
new features instead of doubling up on existing work. Why implement any
unnecessary feature?
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en.
------=_Part_1013_4889038.1361061930273
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
<blockquote class=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; borde=
r-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style=
: solid; padding-left: 1ex;">Your code has a `struct <b>wrapper</b>` i=
n it. Which wraps the type. Therefore, a wrapper is being employed. The fac=
t that it's not explicit in the `unique_ptr` signature is irrelevant; you s=
till wrote a wrapper.<br>And a bad wrapper at that, since it assumes that t=
here is such a thing as a "null handle value". Which is not an assumption w=
e should be making.</blockquote><div><br></div><div>It's an irrelevant impl=
ementation detail. Also, the proposed mechanism *also* assumes "null handle=
value" *and* even if I didn't want to assume that, then std::optional<T=
> would serve just fine. </div><div><br></div><blockquote class=3D"=
gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; border-left-width: 1px; bo=
rder-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left=
: 1ex;">Massive redundancy of what? And no, it will not be a duplicate in i=
nterface or implementation. Its equivalent of a `get` function won't return=
a pointer, for example. It won't have an `operator->`.</blockquote><div=
><br></div><div>Neither does mine, on either count.</div><div><br></div><bl=
ockquote class=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; border-l=
eft-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: s=
olid; padding-left: 1ex;">`unique_handle` probably won't even have an "empt=
y" member function.</blockquote><div><br></div><div>The proposal clearly in=
dicates otherwise.</div><div><br></div><blockquote class=3D"gmail_quote" st=
yle=3D"margin: 0px 0px 0px 0.8ex; border-left-width: 1px; border-left-color=
: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex;"> A=
re you being serious? An integer is not like a pointer. You can't deference=
them, and you shouldn't want to. They don't have null values, and you shou=
ldn't pretend/assume otherwise.</blockquote><div><br></div><div>You also ca=
n't de-reference many kinds of pointer- for example, you can't meaningfully=
de-ref a function pointer, nor a pointer to an incomplete type, or a void =
pointer. Again, the proposal clearly calls for nullability and even if it d=
idn't, std::optional would act fine here. In any case, you <i>can =
;</i>dereference the unique_ptr with the deleter I have described, and the =
semantics mirror those of other kinds of pointer.</div><div><br></div><div>=
A handle and a pointer <i>are</i> the same concept. They are an o=
bject whose sole purpose is to uniquely identify and provide access to some=
other object. That is why they can share the same interface.</div><div><br=
></div><blockquote class=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex=
; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-lef=
t-style: solid; padding-left: 1ex;">The only advantage you've stated is tha=
t you get to reuse existing APIs, like std::hash</blockquote><div><br></div=
><div>How about massively simpler design, specification, and implementation=
? The Committee could spend their time fixing actual problems or introducin=
g real new features instead of doubling up on existing work. Why implement =
any unnecessary feature?</div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.<br />
To post to this group, send email to std-proposals@isocpp.org.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/?hl=3Den">http://groups.google.com/a/isocpp.org/group/std-pro=
posals/?hl=3Den</a>.<br />
<br />
<br />
------=_Part_1013_4889038.1361061930273--
.
Author: francisco.mailing.lists@oblita.com
Date: Sat, 16 Feb 2013 17:51:17 -0800 (PST)
Raw View
------=_Part_1048_11205759.1361065877728
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Em s=E1bado, 16 de fevereiro de 2013 22h45min30s UTC-2, DeadMG escreveu:
> Your code has a `struct *wrapper*` in it. Which wraps the type.=20
>> Therefore, a wrapper is being employed. The fact that it's not explicit =
in=20
>> the `unique_ptr` signature is irrelevant; you still wrote a wrapper.
>> And a bad wrapper at that, since it assumes that there is such a thing a=
s=20
>> a "null handle value". Which is not an assumption we should be making.
>
>
> It's an irrelevant implementation detail. Also, the proposed mechanism=20
> *also* assumes "null handle value" *and* even if I didn't want to assume=
=20
> that, then std::optional<T> would serve just fine.=20
>
> Massive redundancy of what? And no, it will not be a duplicate in=20
>> interface or implementation. Its equivalent of a `get` function won't=20
>> return a pointer, for example. It won't have an `operator->`.
>
>
> Neither does mine, on either count.
>
> `unique_handle` probably won't even have an "empty" member function.
>
>
> The proposal clearly indicates otherwise.
>
> Are you being serious? An integer is not like a pointer. You can't=20
>> deference them, and you shouldn't want to. They don't have null values, =
and=20
>> you shouldn't pretend/assume otherwise.
>
>
> You also can't de-reference many kinds of pointer- for example, you can't=
=20
> meaningfully de-ref a function pointer, nor a pointer to an incomplete=20
> type, or a void pointer. Again, the proposal clearly calls for nullabilit=
y=20
> and even if it didn't, std::optional would act fine here. In any case, yo=
u=20
> *can *dereference the unique_ptr with the deleter I have described, and=
=20
> the semantics mirror those of other kinds of pointer.
>
> A handle and a pointer *are* the same concept. They are an object whose=
=20
> sole purpose is to uniquely identify and provide access to some other=20
> object. That is why they can share the same interface.
>
> The only advantage you've stated is that you get to reuse existing APIs,=
=20
>> like std::hash
>
>
> How about massively simpler design, specification, and implementation? Th=
e=20
> Committee could spend their time fixing actual problems or introducing re=
al=20
> new features instead of doubling up on existing work. Why implement any=
=20
> unnecessary feature?
>
I guess your wording goes too much toward the *possible* detail flaws of=20
the current *non finished* proposal, aiming at dropping it altogether, and=
=20
less on what matters, "Does the main message makes sense? If available,=20
would it turn things clearer, *KISS?* Would developers mass benefit in=20
general?"
If one see a point on something, then argue for helping / improving,=20
whatever way, not dropping for letting things just as they are, awkward.
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/?hl=3Den.
------=_Part_1048_11205759.1361065877728
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Em s=E1bado, 16 de fevereiro de 2013 22h45min30s UTC-2, DeadMG escreveu:<b=
r><blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;b=
order-left: 1px #ccc solid;padding-left: 1ex;"><blockquote class=3D"gmail_q=
uote" style=3D"margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-c=
olor:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Your code h=
as a `struct <b>wrapper</b>` in it. Which wraps the type. Therefore, a=
wrapper is being employed. The fact that it's not explicit in the `unique_=
ptr` signature is irrelevant; you still wrote a wrapper.<br>And a bad wrapp=
er at that, since it assumes that there is such a thing as a "null handle v=
alue". Which is not an assumption we should be making.</blockquote><div><br=
></div><div>It's an irrelevant implementation detail. Also, the proposed me=
chanism *also* assumes "null handle value" *and* even if I didn't want to a=
ssume that, then std::optional<T> would serve just fine. </div><=
div><br></div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px=
0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left=
-style:solid;padding-left:1ex">Massive redundancy of what? And no, it will =
not be a duplicate in interface or implementation. Its equivalent of a `get=
` function won't return a pointer, for example. It won't have an `operator-=
>`.</blockquote><div><br></div><div>Neither does mine, on either count.<=
/div><div><br></div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0=
px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);borde=
r-left-style:solid;padding-left:1ex">`unique_handle` probably won't even ha=
ve an "empty" member function.</blockquote><div><br></div><div>The proposal=
clearly indicates otherwise.</div><div><br></div><blockquote class=3D"gmai=
l_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left-width:1px;border-lef=
t-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"> Ar=
e you being serious? An integer is not like a pointer. You can't deference =
them, and you shouldn't want to. They don't have null values, and you shoul=
dn't pretend/assume otherwise.</blockquote><div><br></div><div>You also can=
't de-reference many kinds of pointer- for example, you can't meaningfully =
de-ref a function pointer, nor a pointer to an incomplete type, or a void p=
ointer. Again, the proposal clearly calls for nullability and even if it di=
dn't, std::optional would act fine here. In any case, you <i>can =
</i>dereference the unique_ptr with the deleter I have described, and the s=
emantics mirror those of other kinds of pointer.</div><div><br></div><div>A=
handle and a pointer <i>are</i> the same concept. They are an ob=
ject whose sole purpose is to uniquely identify and provide access to some =
other object. That is why they can share the same interface.</div><div><br>=
</div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;b=
order-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:s=
olid;padding-left:1ex">The only advantage you've stated is that you get to =
reuse existing APIs, like std::hash</blockquote><div><br></div><div>How abo=
ut massively simpler design, specification, and implementation? The Committ=
ee could spend their time fixing actual problems or introducing real new fe=
atures instead of doubling up on existing work. Why implement any unnecessa=
ry feature?</div></blockquote><div><br></div><div>I guess your wording goes=
too much toward the <i>possible</i> detail flaws of the current <i>no=
n finished</i> proposal, aiming at dropping it altogether, and less on what=
matters, "Does the main message makes sense? If available, would it turn t=
hings clearer, <i>KISS?</i> Would developers mass benefit in general?"=
</div><div><br></div><div>If one see a point on something, then argue for h=
elping / improving, whatever way, not dropping for letting things just as t=
hey are, awkward.</div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.<br />
To post to this group, send email to std-proposals@isocpp.org.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/?hl=3Den">http://groups.google.com/a/isocpp.org/group/std-pro=
posals/?hl=3Den</a>.<br />
<br />
<br />
------=_Part_1048_11205759.1361065877728--
.
Author: francisco.mailing.lists@oblita.com
Date: Sat, 16 Feb 2013 18:16:24 -0800 (PST)
Raw View
------=_Part_1035_8393638.1361067384030
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Em s=E1bado, 16 de fevereiro de 2013 22h45min30s UTC-2, DeadMG escreveu:
> A handle and a pointer *are* the same concept. They are an object whose=
=20
> sole purpose is to uniquely identify and provide access to some other=20
> object. That is why they can share the same interface.
>
Handles and pointers share the concept of indirection, but they are not the=
=20
same concept. One example, impersonation of the handle by the smart handle=
=20
is fine. The smart handle doesn't get in the way when using the handle=20
based API, using it passing the smart handle is the same as the handle=20
itself, and you get the benefit of RAII, without the pain. This feature=20
fells natural to smart handles.
Does it makes sense to smart pointers?
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/?hl=3Den.
------=_Part_1035_8393638.1361067384030
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Em s=E1bado, 16 de fevereiro de 2013 22h45min30s UTC-2, DeadMG escreveu:<b=
r><blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;b=
order-left: 1px #ccc solid;padding-left: 1ex;"><div>A handle and a pointer&=
nbsp;<i>are</i> the same concept. They are an object whose sole purpos=
e is to uniquely identify and provide access to some other object. That is =
why they can share the same interface.</div></blockquote><div><br></div><di=
v>Handles and pointers share the concept of indirection, but they are not t=
he same concept. One example, impersonation of the handle by the smart hand=
le is fine. The smart handle doesn't get in the way when using the handle b=
ased API, using it passing the smart handle is the same as the handle itsel=
f, and you get the benefit of RAII, without the pain. This feature fells na=
tural to smart handles.</div><div><br></div><div>Does it makes sense to sma=
rt pointers?</div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.<br />
To post to this group, send email to std-proposals@isocpp.org.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/?hl=3Den">http://groups.google.com/a/isocpp.org/group/std-pro=
posals/?hl=3Den</a>.<br />
<br />
<br />
------=_Part_1035_8393638.1361067384030--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Sat, 16 Feb 2013 19:52:11 -0800 (PST)
Raw View
------=_Part_118_11400465.1361073131713
Content-Type: text/plain; charset=ISO-8859-1
On Saturday, February 16, 2013 4:45:30 PM UTC-8, DeadMG wrote:
>
> Your code has a `struct *wrapper*` in it. Which wraps the type.
>> Therefore, a wrapper is being employed. The fact that it's not explicit in
>> the `unique_ptr` signature is irrelevant; you still wrote a wrapper.
>> And a bad wrapper at that, since it assumes that there is such a thing as
>> a "null handle value". Which is not an assumption we should be making.
>
>
> It's an irrelevant implementation detail.
>
Irrelevant?
auto handle = some_unique_handle.get();
What type is `handle`? If this were a proper, dedicated object, it would be
the actual handle type. But it's not; it's a "handle_deleter<...>::wrapper".
Now consider this, for a handle type that is itself a live object:
auto &handle = some_unique_handle.get();
handle.call_something();
That doesn't work. That's a leaky abstraction; your "irrelevant
implementation detail" just became very relevant for the programmer who
expected rather different behavior.
Also, the proposed mechanism *also* assumes "null handle value" *and* even
> if I didn't want to assume that, then std::optional<T> would serve just
> fine.
>
That's something that should be fixed in the proposal then.
Massive redundancy of what? And no, it will not be a duplicate in interface
>> or implementation. Its equivalent of a `get` function won't return a
>> pointer, for example. It won't have an `operator->`.
>
>
> Neither does mine, on either count.
>
How does your code remove operator-> from the unique_ptr interface?
`unique_handle` probably won't even have an "empty" member function.
>
>
> The proposal clearly indicates otherwise.
>
> Are you being serious? An integer is not like a pointer. You can't
>> deference them, and you shouldn't want to. They don't have null values, and
>> you shouldn't pretend/assume otherwise.
>
>
> You also can't de-reference many kinds of pointer- for example, you can't
> meaningfully de-ref a function pointer, nor a pointer to an incomplete
> type, or a void pointer.
>
Which is one of the reasons why you would never put them in a *smart pointer
*.
> Again, the proposal clearly calls for nullability and even if it didn't,
> std::optional would act fine here. In any case, you *can *dereference the
> unique_ptr with the deleter I have described, and the semantics mirror
> those of other kinds of pointer.
>
> A handle and a pointer *are* the same concept. They are an object whose
> sole purpose is to uniquely identify and provide access to some other
> object. That is why they can share the same interface.
>
Except that pointers are direct references with full language-level support
and handles are, generally speaking, not. Also, pointers can have pointer
arithmetic done on them. And so forth.
The only advantage you've stated is that you get to reuse existing APIs,
>> like std::hash
>
>
> How about massively simpler design, specification, and implementation?
>
Ignoring the leaky abstraction issue I pointed out earlier, it's ultimately
no simpler to specify than a real object. Indeed, the specification is more
complicated, since you have to deal with adding a `make_unique_handle`
call, a nested struct, a template alias, and whatever other detritus is
needed to make this bastardization of a unique_ptr into something that
doesn't look like what it is.
The Committee could spend their time fixing actual problems or introducing
> real new features instead of doubling up on existing work. Why implement
> any unnecessary feature?
>
Aside from the leaky abstraction issue? User sanity. There are already
enough stupid things in C++ that we have to tell programmers to do. We
shouldn't be telling people to put handles and non-pointer types into smart
pointer objects on top of that.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en.
------=_Part_118_11400465.1361073131713
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
On Saturday, February 16, 2013 4:45:30 PM UTC-8, DeadMG wrote:<blockquote c=
lass=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px=
#ccc solid;padding-left: 1ex;"><blockquote class=3D"gmail_quote" style=3D"=
margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,20=
4,204);border-left-style:solid;padding-left:1ex">Your code has a `struct&nb=
sp;<b>wrapper</b>` in it. Which wraps the type. Therefore, a wrapper is bei=
ng employed. The fact that it's not explicit in the `unique_ptr` signature =
is irrelevant; you still wrote a wrapper.<br>And a bad wrapper at that, sin=
ce it assumes that there is such a thing as a "null handle value". Which is=
not an assumption we should be making.</blockquote><div><br></div><div>It'=
s an irrelevant implementation detail.</div></blockquote><div><br>Irrelevan=
t?<br><br><div class=3D"prettyprint" style=3D"background-color: rgb(250, 25=
0, 250); border-color: rgb(187, 187, 187); border-style: solid; border-widt=
h: 1px; word-wrap: break-word;"><code class=3D"prettyprint"><div class=3D"s=
ubprettyprint"><span style=3D"color: #008;" class=3D"styled-by-prettify">au=
to</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> handle =
</span><span style=3D"color: #660;" class=3D"styled-by-prettify">=3D</span>=
<span style=3D"color: #000;" class=3D"styled-by-prettify"> some_unique_hand=
le</span><span style=3D"color: #660;" class=3D"styled-by-prettify">.</span>=
<span style=3D"color: #008;" class=3D"styled-by-prettify">get</span><span s=
tyle=3D"color: #660;" class=3D"styled-by-prettify">();</span><span style=3D=
"color: #000;" class=3D"styled-by-prettify"><br></span></div></code></div><=
br>What type is `handle`? If this were a proper, dedicated object, it would=
be the actual handle type. But it's not; it's a "handle_deleter<...>=
::wrapper".<br><br>Now consider this, for a handle type that is itself a li=
ve object:<br><br><div class=3D"prettyprint" style=3D"background-color: rgb=
(250, 250, 250); border-color: rgb(187, 187, 187); border-style: solid; bor=
der-width: 1px; word-wrap: break-word;"><code class=3D"prettyprint"><div cl=
ass=3D"subprettyprint"><span style=3D"color: #008;" class=3D"styled-by-pret=
tify">auto</span><span style=3D"color: #000;" class=3D"styled-by-prettify">=
</span><span style=3D"color: #660;" class=3D"styled-by-prettify">&</sp=
an><span style=3D"color: #000;" class=3D"styled-by-prettify">handle </span>=
<span style=3D"color: #660;" class=3D"styled-by-prettify">=3D</span><span s=
tyle=3D"color: #000;" class=3D"styled-by-prettify"> some_unique_handle</spa=
n><span style=3D"color: #660;" class=3D"styled-by-prettify">.</span><span s=
tyle=3D"color: #008;" class=3D"styled-by-prettify">get</span><span style=3D=
"color: #660;" class=3D"styled-by-prettify">();</span><span style=3D"color:=
#000;" class=3D"styled-by-prettify"><br>handle</span><span style=3D"color:=
#660;" class=3D"styled-by-prettify">.</span><span style=3D"color: #000;" c=
lass=3D"styled-by-prettify">call_something</span><span style=3D"color: #660=
;" class=3D"styled-by-prettify">();</span><span style=3D"color: #000;" clas=
s=3D"styled-by-prettify"><br></span></div></code></div><br>That doesn't wor=
k. That's a leaky abstraction; your "irrelevant implementation detail" just=
became very relevant for the programmer who expected rather different beha=
vior.<br><br></div><blockquote class=3D"gmail_quote" style=3D"margin: 0;mar=
gin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div>Also, =
the proposed mechanism *also* assumes "null handle value" *and* even if I d=
idn't want to assume that, then std::optional<T> would serve just fin=
e.</div></blockquote><div><br>That's something that should be fixed in the =
proposal then.<br><br></div><blockquote class=3D"gmail_quote" style=3D"marg=
in: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><d=
iv></div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8e=
x;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-styl=
e:solid;padding-left:1ex">Massive redundancy of what? And no, it will not b=
e a duplicate in interface or implementation. Its equivalent of a `get` fun=
ction won't return a pointer, for example. It won't have an `operator->`=
..</blockquote><div><br></div><div>Neither does mine, on either count.</div>=
</blockquote><div><br>How does your code remove operator-> from the uniq=
ue_ptr interface?<br><br></div><blockquote class=3D"gmail_quote" style=3D"m=
argin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"=
><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border=
-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;=
padding-left:1ex">`unique_handle` probably won't even have an "empty" membe=
r function.</blockquote><div><br></div><div>The proposal clearly indicates =
otherwise.</div><div><br></div><blockquote class=3D"gmail_quote" style=3D"m=
argin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204=
,204);border-left-style:solid;padding-left:1ex"> Are you being serious=
? An integer is not like a pointer. You can't deference them, and you shoul=
dn't want to. They don't have null values, and you shouldn't pretend/assume=
otherwise.</blockquote><div><br></div><div>You also can't de-reference man=
y kinds of pointer- for example, you can't meaningfully de-ref a function p=
ointer, nor a pointer to an incomplete type, or a void pointer.</div></bloc=
kquote><div><br>Which is one of the reasons why you would never put them in=
a <i>smart pointer</i>.<br> </div><blockquote class=3D"gmail_quote" s=
tyle=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-le=
ft: 1ex;"><div>Again, the proposal clearly calls for nullability and even i=
f it didn't, std::optional would act fine here. In any case, you <i>ca=
n </i>dereference the unique_ptr with the deleter I have described, an=
d the semantics mirror those of other kinds of pointer.</div><div><br></div=
><div>A handle and a pointer <i>are</i> the same concept. They ar=
e an object whose sole purpose is to uniquely identify and provide access t=
o some other object. That is why they can share the same interface.</div></=
blockquote><div><br>Except that pointers are direct references with full la=
nguage-level support and handles are, generally speaking, not. Also, pointe=
rs can have pointer arithmetic done on them. And so forth.<br><br></div><bl=
ockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border=
-left: 1px #ccc solid;padding-left: 1ex;"><div></div><blockquote class=3D"g=
mail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left-width:1px;border-=
left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">The o=
nly advantage you've stated is that you get to reuse existing APIs, like st=
d::hash</blockquote><div><br></div><div>How about massively simpler design,=
specification, and implementation?</div></blockquote><div><br>Ignoring the=
leaky abstraction issue I pointed out earlier, it's ultimately no simpler =
to specify than a real object. Indeed, the specification is more complicate=
d, since you have to deal with adding a `make_unique_handle` call, a nested=
struct, a template alias, and whatever other detritus is needed to make th=
is bastardization of a unique_ptr into something that doesn't look like wha=
t it is.<br><br></div><blockquote class=3D"gmail_quote" style=3D"margin: 0;=
margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div>The=
Committee could spend their time fixing actual problems or introducing rea=
l new features instead of doubling up on existing work. Why implement any u=
nnecessary feature?</div></blockquote><div><br>Aside from the leaky abstrac=
tion issue? User sanity. There are already enough stupid things in C++ that=
we have to tell programmers to do. We shouldn't be telling people to put h=
andles and non-pointer types into smart pointer objects on top of that.<br>=
</div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.<br />
To post to this group, send email to std-proposals@isocpp.org.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/?hl=3Den">http://groups.google.com/a/isocpp.org/group/std-pro=
posals/?hl=3Den</a>.<br />
<br />
<br />
------=_Part_118_11400465.1361073131713--
.
Author: DeadMG <wolfeinstein@gmail.com>
Date: Sun, 17 Feb 2013 02:21:58 -0800 (PST)
Raw View
------=_Part_114_21951157.1361096518997
Content-Type: text/plain; charset=ISO-8859-1
>
> What type is `handle`? If this were a proper, dedicated object, it would
> be the actual handle type.
You're making a flawed leap here. That's not true at all. The point is to
wrap handles, to provide a better interface for them, not to simply
replicate them with a class sticker on top. Requiring *handle.get() for
access is simply uniform with pointers.
That's a leaky abstraction; your "irrelevant implementation detail" just
> became very relevant for the programmer who expected rather different
> behavior.
And yours would be very relevant for the programmer who expected the
behaviour I'm suggesting. No abstraction is ever perfect- just for a simple
example, not all containers offer the iterator invalidation semantics of a
linked-list. There's nothing wrong with requiring *p to get at your handle.
How does your code remove operator-> from the unique_ptr interface?
Well, you ain't gonna get very far if you try to use it. Just like how you
wouldn't get very far trying to use the copy constructor of a
vector<unique_ptr>, or resize().
Which is one of the reasons why you would never put them in a *smart pointer
> *.
I can and have, and I've seen plenty of other people do the same- even
function pointers, under some specific circumstances. Smart pointers are
about managing lifetime- if you need to manage something's lifetime, you
need a smart pointer. Pointer arithmetic and de-referencing are irrelevant
if you don't need them.
Except that pointers are direct references with full language-level support
> and handles are, generally speaking, not.
Irrelevant.
Also, pointers can have pointer arithmetic done on them. And so forth.
Not all of them- cue, like, my original examples above. And for many, many
pointers, in fact virtually all that I ever create, using pointer
arithmetic on them would be a bad idea, as they are only one single object.
Indeed, the specification is more complicated, since you have to deal with
> adding a `make_unique_handle` call, a nested struct, a template alias, and
> whatever other detritus is needed to make this bastardization of a
> unique_ptr into something that doesn't look like what it is.
You're wrong. Firstly, the guy wants the make_unique_handle and template
alias (or equivalent) *anyway*. Secondly, it's a lot easier to specify the
deleter type than *four* resource handling templates. I mean, the full
implementation even is substantially less.
There are already enough stupid things in C++ that we have to tell
> programmers to do. We shouldn't be telling people to put handles and
> non-pointer types into smart pointer objects on top of that.
Aye, totally stupid, like ... re-using existing functionality instead of
re-inventing the wheel, creating uniform interfaces instead of needlessly
disparate ones, etc.
The simple fact is that unique_ptr is not really a smart pointer at all. It
is a smart resource handling object. It's just named _ptr because that's
the most common. The deleter's pointer typedef exists for a reason, and
it's to hold things other than T* as the contained resource. Would that
shared_ptr was so flexible. Perhaps I should consider a proposal to address
that weakness.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en.
------=_Part_114_21951157.1361096518997
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
<blockquote class=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; borde=
r-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style=
: solid; padding-left: 1ex;">What type is `handle`? If this were a proper, =
dedicated object, it would be the actual handle type. </blockquote><di=
v><br></div><div>You're making a flawed leap here. That's not true at all. =
The point is to wrap handles, to provide a better interface for them, not t=
o simply replicate them with a class sticker on top. Requiring *handle.get(=
) for access is simply uniform with pointers. </div><div><br></div><bl=
ockquote class=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; border-l=
eft-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: s=
olid; padding-left: 1ex;"> That's a leaky abstraction; your "irrelevan=
t implementation detail" just became very relevant for the programmer who e=
xpected rather different behavior.</blockquote><div><br></div><div>And your=
s would be very relevant for the programmer who expected the behaviour I'm =
suggesting. No abstraction is ever perfect- just for a simple example, not =
all containers offer the iterator invalidation semantics of a linked-list. =
There's nothing wrong with requiring *p to get at your handle.</div><div><b=
r></div><blockquote class=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8e=
x; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-le=
ft-style: solid; padding-left: 1ex;">How does your code remove operator->=
; from the unique_ptr interface?</blockquote><div><br></div><div>Well, you =
ain't gonna get very far if you try to use it. Just like how you wouldn't g=
et very far trying to use the copy constructor of a vector<unique_ptr>=
;, or resize().</div><div><br></div><blockquote class=3D"gmail_quote" style=
=3D"margin: 0px 0px 0px 0.8ex; border-left-width: 1px; border-left-color: r=
gb(204, 204, 204); border-left-style: solid; padding-left: 1ex;">Which is o=
ne of the reasons why you would never put them in a <i>smart pointer</=
i>.</blockquote><div><br></div><div>I can and have, and I've seen plenty of=
other people do the same- even function pointers, under some specific circ=
umstances. Smart pointers are about managing lifetime- if you need to manag=
e something's lifetime, you need a smart pointer. Pointer arithmetic and de=
-referencing are irrelevant if you don't need them.</div><div><br></div><bl=
ockquote class=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; border-l=
eft-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: s=
olid; padding-left: 1ex;">Except that pointers are direct references with f=
ull language-level support and handles are, generally speaking, not.</block=
quote><div><br></div><div>Irrelevant.</div><div><br></div><blockquote class=
=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; border-left-width: 1px=
; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-=
left: 1ex;"> Also, pointers can have pointer arithmetic done on them. =
And so forth.</blockquote><div><br></div><div>Not all of them- cue, like, m=
y original examples above. And for many, many pointers, in fact virtually a=
ll that I ever create, using pointer arithmetic on them would be a bad idea=
, as they are only one single object.</div><div><br></div><blockquote class=
=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; border-left-width: 1px=
; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-=
left: 1ex;"> Indeed, the specification is more complicated, since you =
have to deal with adding a `make_unique_handle` call, a nested struct, a te=
mplate alias, and whatever other detritus is needed to make this bastardiza=
tion of a unique_ptr into something that doesn't look like what it is.</blo=
ckquote><div><br></div><div>You're wrong. Firstly, the guy wants the make_u=
nique_handle and template alias (or equivalent) <i>anyway</i>. Secondly, it=
's a lot easier to specify the deleter type than *four* resource handling t=
emplates. I mean, the full implementation even is substantially less.</div>=
<div><br></div><blockquote class=3D"gmail_quote" style=3D"margin: 0px 0px 0=
px 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); bo=
rder-left-style: solid; padding-left: 1ex;"> There are already enough =
stupid things in C++ that we have to tell programmers to do. We shouldn't b=
e telling people to put handles and non-pointer types into smart pointer ob=
jects on top of that.</blockquote><div><br></div><div>Aye, totally stupid, =
like ... re-using existing functionality instead of re-inventing the wheel,=
creating uniform interfaces instead of needlessly disparate ones, etc.</di=
v><div><br></div><div>The simple fact is that unique_ptr is not really a sm=
art pointer at all. It is a smart resource handling object. It's just named=
_ptr because that's the most common. The deleter's pointer typedef exists =
for a reason, and it's to hold things other than T* as the contained resour=
ce. Would that shared_ptr was so flexible. Perhaps I should consider a prop=
osal to address that weakness.</div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.<br />
To post to this group, send email to std-proposals@isocpp.org.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/?hl=3Den">http://groups.google.com/a/isocpp.org/group/std-pro=
posals/?hl=3Den</a>.<br />
<br />
<br />
------=_Part_114_21951157.1361096518997--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Sun, 17 Feb 2013 21:49:04 -0800 (PST)
Raw View
------=_Part_252_19432355.1361166544968
Content-Type: text/plain; charset=ISO-8859-1
On Sunday, February 17, 2013 2:21:58 AM UTC-8, DeadMG wrote:
>
> What type is `handle`? If this were a proper, dedicated object, it would
>> be the actual handle type.
>
>
> You're making a flawed leap here. That's not true at all. The point is to
> wrap handles, to provide a better interface for them, not to simply
> replicate them with a class sticker on top. Requiring *handle.get() for
> access is simply uniform with pointers.
>
And why do we want them to be uniform with pointers? I certainly don't. I
would no more expect `handle.get()` to return a pointer to the handle than
I would expect `optional<T>::get()` to return a pointer to T.
That's a leaky abstraction; your "irrelevant implementation detail" just
>> became very relevant for the programmer who expected rather different
>> behavior.
>
>
> And yours would be very relevant for the programmer who expected the
> behaviour I'm suggesting.
>
Which is... who, exactly? Who expects handles, which don't mention pointers
anywhere in their interface, to return pointers to their contents?
References, yes; pointers, no.
I would expect a handle to be implicitly convertible to the handle type,
because handle types are supposed to be small, trivially copied objects.
That way, I could use them exactly as I did before.
No abstraction is ever perfect- just for a simple example, not all
> containers offer the iterator invalidation semantics of a linked-list.
> There's nothing wrong with requiring *p to get at your handle.
>
No abstraction is perfect, true. But my point is that *you don't need an
abstraction here*. The only reason you have this leak is because of your
insistence on bastardizing `unique_ptr`. It's an implementation detail that
many people who would use the class neither wants or cares about.
Nobody is going to create a template function that takes a `unique_ptr<T,
D>` which works correctly with both handles and pointers. Not unless the
only thing they're doing is forwarding it to someone who actually does care
about that distinction. And in that case, they'll just take a `T`, since
they obviously don't care about the details of the type.
Whatever implementation burden is lessened by making them the same is
offset by the basic usability that is lost by doing this.
How does your code remove operator-> from the unique_ptr interface?
>
>
> Well, you ain't gonna get very far if you try to use it. Just like how you
> wouldn't get very far trying to use the copy constructor of a
> vector<unique_ptr>, or resize().
>
Ignoring the fact that resize() works on non-copyable `T`s, the biggest
difference is that you use these things for very different purposes. The
way you want to interface with a dynamic array of `unique_ptr` is
conceptually identical to the way you want to interface with a dynamic
array of any `T` that is copyable. The only restrictions on how you would
use them are simply the restrictions of how you would use `T`. In short,
`vector` is simply forwarding those restrictions to you.
The user of a unique_handle does not *want *to do `*handle.get()` to get
the handle. They expect and want to do `handle.get()`. Just like the user
of `optional` does not want to do `*opt.get()`; they want to do `*opt`.
They're different types, because they have different purposes.
They don't want the leaky abstraction; they want the real class with an
interface designed for this specific purpose and their needs.
I mean, you could re-implement shared_ptr in terms of unique_ptr, if you
expanded unique_ptr's interface. All those shared_ptr-only functions just
wouldn't work if you called them without an appropriate special deleter.
Indeed, you could turn it into some monstrous policy-based shared_ptr. So
why not propose that?
Because unique_ptr has a very specific use: the management of uniquely
owned pointer-like objects.
Which is one of the reasons why you would never put them in a *smart pointer
>> *.
>
>
> I can and have, and I've seen plenty of other people do the same- even
> function pointers, under some specific circumstances.
>
And I've seen people who don't. What makes you and yours right and me and
mine wrong?
> Smart pointers are about managing lifetime- if you need to manage
> something's lifetime, you need a smart pointer. Pointer arithmetic and
> de-referencing are irrelevant if you don't need them.
>
> Except that pointers are direct references with full language-level
>> support and handles are, generally speaking, not.
>
>
> Irrelevant.
>
`unique_ptr` has interfaces dedicated to accessing that langauge-level
support. It's *very* relevant, because those interfaces no longer work.
There are already enough stupid things in C++ that we have to tell
>> programmers to do. We shouldn't be telling people to put handles and
>> non-pointer types into smart pointer objects on top of that.
>
>
> Aye, totally stupid, like ... re-using existing functionality instead of
> re-inventing the wheel, creating uniform interfaces instead of needlessly
> disparate ones, etc.
>
> The simple fact is that unique_ptr is not really a smart pointer at all.
> It is a smart resource handling object.
>
Really? Allow me to quote from the standard, the very first paragraph of
section 20.7.1:
A unique pointer is an object that owns another object and manages that
> other object through a pointer.
> More precisely, a unique pointer is an object u that stores a pointer to a
> second object p and will dispose of
> p when u is itself destroyed (e.g., when leaving block scope (6.7)). In
> this context, u is said to own p.
>
Sounds like it is for managing the lifetime of a *pointer* to me. The fact
that the deleter's hook is called `pointer` also seems suggestive. The fact
that `D::pointer` needs to follow the Nullable*Pointer* concept, instead of
something more generic for arbitrary objects (such as simply being only
contextually convertible to bool to detect its presence or absence) is also
suggestive.
If the standards committee wanted `unique_ptr` to be a generalized "unique
manager of arbitrary thing", they failed. The definition has a very pretty
strong bias to pointers and pointer-like objects. And if you were going to
design a "unique manager of arbitrary thing", you would not use
`unique_ptr`'s interface or its restrictions on `D::pointer`.
So no, it's not a "smart resource handling object"; a smart resource
handling object wouldn't call it's contents a *pointer*, nor would it
expect its contents to exhibit pointer-like behavior such as comparing with
`std::nullptr_t`.
You are proposing a hack. Not the natural, expected functionality of
`unique_ptr`. That extensibility hook is for adding pointer-like objects to
a `unique_ptr`; this is nothing more than making round pegs fit into square
holes. The only evidence you have that this is the intended use of this
hook is that people use it that way, which does not constitute evidence of *
intent*.
Also, the whole "re-inventing the wheel" argument would be a lot more
persuasive if the implementation of unique_handle was longer than 100
lines. We're not talking about any significant amount of code here.
It's just named _ptr because that's the most common. The deleter's pointer
> typedef exists for a reason, and it's to hold things other than T* as the
> contained resource. Would that shared_ptr was so flexible. Perhaps I should
> consider a proposal to address that weakness.
>
And while you're at it, we could replace the entire `std::optional`
proposal with a `unique_ptr` with a specialized deleter and some nice
aliases and global functions to create it. Why not? You could get most of
the interface working just fine. Using the deleter's type, you could even
have it be put on the stack instead of having to allocate the memory. Oh
sure, the `get` method will return a wrapper instead of a `T&`. And it
probably couldn't be a literal type and thus couldn't be used in constexpr
scenarios. But who cares about little things like *usability* and having a
reasonable interface? We managed to shoehorn `unique_ptr` into yet another
type!
The fact that you *can* implement something one way does not mean you *
should*. Just because an extensibility hook exists does not mean you should
employ it in *every possible *circumstance.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en.
------=_Part_252_19432355.1361166544968
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
On Sunday, February 17, 2013 2:21:58 AM UTC-8, DeadMG wrote:<blockquote cla=
ss=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #=
ccc solid;padding-left: 1ex;"><blockquote class=3D"gmail_quote" style=3D"ma=
rgin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,=
204);border-left-style:solid;padding-left:1ex">What type is `handle`? If th=
is were a proper, dedicated object, it would be the actual handle type.&nbs=
p;</blockquote><div><br></div><div>You're making a flawed leap here. That's=
not true at all. The point is to wrap handles, to provide a better interfa=
ce for them, not to simply replicate them with a class sticker on top. Requ=
iring *handle.get() for access is simply uniform with pointers.</div></bloc=
kquote><div><br>And why do we want them to be uniform with pointers? I cert=
ainly don't. I would no more expect `handle.get()` to return a pointer to t=
he handle than I would expect `optional<T>::get()` to return a pointe=
r to T.<br><br></div><blockquote class=3D"gmail_quote" style=3D"margin: 0;m=
argin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><blockquo=
te class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left-widt=
h:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-le=
ft:1ex"> That's a leaky abstraction; your "irrelevant implementation d=
etail" just became very relevant for the programmer who expected rather dif=
ferent behavior.</blockquote><div><br></div><div>And yours would be very re=
levant for the programmer who expected the behaviour I'm suggesting.</div><=
/blockquote><div><br>Which is... who, exactly? Who expects handles, which d=
on't mention pointers anywhere in their interface, to return pointers to th=
eir contents? References, yes; pointers, no.<br><br>I would expect a handle=
to be implicitly convertible to the handle type, because handle types are =
supposed to be small, trivially copied objects. That way, I could use them =
exactly as I did before.<br><br></div><blockquote class=3D"gmail_quote" sty=
le=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left=
: 1ex;"><div>No abstraction is ever perfect- just for a simple example, not=
all containers offer the iterator invalidation semantics of a linked-list.=
There's nothing wrong with requiring *p to get at your handle.</div></bloc=
kquote><div><br>No abstraction is perfect, true. But my point is that <i>yo=
u don't need an abstraction here</i>. The only reason you have this leak is=
because of your insistence on bastardizing `unique_ptr`. It's an implement=
ation detail that many people who would use the class neither wants or care=
s about.<br><br>Nobody is going to create a template function that takes a =
`unique_ptr<T, D>` which works correctly with both handles and pointe=
rs. Not unless the only thing they're doing is forwarding it to someone who=
actually does care about that distinction. And in that case, they'll just =
take a `T`, since they obviously don't care about the details of the type.<=
br><br>Whatever implementation burden is lessened by making them the same i=
s offset by the basic usability that is lost by doing this.<br><br></div><b=
lockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;borde=
r-left: 1px #ccc solid;padding-left: 1ex;"><div></div><blockquote class=3D"=
gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left-width:1px;border=
-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">How =
does your code remove operator-> from the unique_ptr interface?</blockqu=
ote><div><br></div><div>Well, you ain't gonna get very far if you try to us=
e it. Just like how you wouldn't get very far trying to use the copy constr=
uctor of a vector<unique_ptr>, or resize().</div></blockquote><div><b=
r>Ignoring the fact that resize() works on non-copyable `T`s, the biggest d=
ifference is that you use these things for very different purposes. The way=
you want to interface with a dynamic array of `unique_ptr` is conceptually=
identical to the way you want to interface with a dynamic array of any `T`=
that is copyable. The only restrictions on how you would use them are simp=
ly the restrictions of how you would use `T`. In short, `vector` is simply =
forwarding those restrictions to you.<br><br>The user of a unique_handle do=
es not <i>want </i>to do `*handle.get()` to get the handle. They expect and=
want to do `handle.get()`. Just like the user of `optional` does not want =
to do `*opt.get()`; they want to do `*opt`. They're different types, becaus=
e they have different purposes.<br><br>They don't want the leaky abstractio=
n; they want the real class with an interface designed for this specific pu=
rpose and their needs.<br><br>I mean, you could re-implement shared_ptr in =
terms of unique_ptr, if you=20
expanded unique_ptr's interface. All those shared_ptr-only functions=20
just wouldn't work if you called them without an appropriate special delete=
r. Indeed, you could turn it into some monstrous policy-based shared_ptr. S=
o why not propose that?<br><br>Because unique_ptr has a very specific use: =
the management of uniquely owned pointer-like objects.<br><br></div><blockq=
uote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-lef=
t: 1px #ccc solid;padding-left: 1ex;"><blockquote class=3D"gmail_quote" sty=
le=3D"margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(=
204,204,204);border-left-style:solid;padding-left:1ex">Which is one of the =
reasons why you would never put them in a <i>smart pointer</i>.</block=
quote><div><br></div><div>I can and have, and I've seen plenty of other peo=
ple do the same- even function pointers, under some specific circumstances.=
</div></blockquote><div><br>And I've seen people who don't. What makes you =
and yours right and me and mine wrong?<br> </div><blockquote class=3D"=
gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc so=
lid;padding-left: 1ex;"><div>Smart pointers are about managing lifetime- if=
you need to manage something's lifetime, you need a smart pointer. Pointer=
arithmetic and de-referencing are irrelevant if you don't need them.</div>=
</blockquote><blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-le=
ft: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div><br></div><b=
lockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-le=
ft-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;pad=
ding-left:1ex">Except that pointers are direct references with full languag=
e-level support and handles are, generally speaking, not.</blockquote><div>=
<br></div><div>Irrelevant.</div></blockquote><div><br>`unique_ptr` has inte=
rfaces dedicated to accessing that langauge-level support. It's <i>very</i>=
relevant, because those interfaces no longer work.<br><br></div><blockquot=
e class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: =
1px #ccc solid;padding-left: 1ex;"><blockquote class=3D"gmail_quote" style=
=3D"margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(20=
4,204,204);border-left-style:solid;padding-left:1ex"> There are alread=
y enough stupid things in C++ that we have to tell programmers to do. We sh=
ouldn't be telling people to put handles and non-pointer types into smart p=
ointer objects on top of that.</blockquote><div><br></div><div>Aye, totally=
stupid, like ... re-using existing functionality instead of re-inventing t=
he wheel, creating uniform interfaces instead of needlessly disparate ones,=
etc.</div><div><br></div><div>The simple fact is that unique_ptr is not re=
ally a smart pointer at all. It is a smart resource handling object.</div><=
/blockquote><div><br>Really? Allow me to quote from the standard, the very =
first paragraph of section 20.7.1:<br><br><blockquote style=3D"margin: 0px =
0px 0px 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex=
;" class=3D"gmail_quote"><span style=3D"color: rgb(11, 83, 148);">A unique =
pointer is an object that owns another object and manages that other object=
through a pointer.<br>More precisely, a unique pointer is an object u that=
stores a pointer to a second object p and will dispose of<br>p when u is i=
tself destroyed (e.g., when leaving block scope (6.7)). In this context, u =
is said to own p.</span><br></blockquote><br>Sounds like it is for managing=
the lifetime of a <i>pointer</i>
to me. The fact that the deleter's hook is called `pointer` also seems=20
suggestive. The fact that `D::pointer` needs to follow the Nullable<i>Point=
er</i>
concept, instead of something more generic for arbitrary objects (such=20
as simply being only contextually convertible to bool to detect its=20
presence or absence) is also suggestive.<br><br>If the=20
standards committee wanted `unique_ptr` to be a generalized "unique manager=
of arbitrary thing", they failed. The definition has a very pretty
strong bias to pointers and pointer-like objects. And if you were going to=
design a "unique manager of arbitrary thing", you would not use `unique_pt=
r`'s interface or its restrictions on `D::pointer`.<br><br>So no, it's not =
a "smart resource handling object"; a smart resource handling object wouldn=
't call it's contents a <i>pointer</i>, nor would it expect its contents to=
exhibit pointer-like behavior such as comparing with `std::nullptr_t`.<br>=
<br>You are proposing a hack. Not the natural, expected functionality of `u=
nique_ptr`. That extensibility hook is for adding pointer-like objects to a=
`unique_ptr`; this is nothing more than making round pegs fit into square =
holes. The only evidence you have that this is the intended use of this hoo=
k is that people use it that way, which does not constitute evidence of <i>=
intent</i>.<br><br>Also, the whole "re-inventing the wheel" argument would =
be a lot more persuasive if the implementation of unique_handle was longer =
than 100 lines. We're not talking about any significant amount of code here=
..<br><br></div><blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-=
left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div>It's just =
named _ptr because that's the most common. The deleter's pointer typedef ex=
ists for a reason, and it's to hold things other than T* as the contained r=
esource. Would that shared_ptr was so flexible. Perhaps I should consider a=
proposal to address that weakness.</div></blockquote><div><br>And while yo=
u're at it, we could replace the entire `std::optional` proposal with a `un=
ique_ptr` with a specialized deleter and some nice aliases and global funct=
ions to create it. Why not? You could get most of the interface working jus=
t fine. Using the deleter's type, you could even have it be put on the stac=
k instead of having to allocate the memory. Oh sure, the `get` method will =
return a wrapper instead of a `T&`. And it probably couldn't be a liter=
al type and thus couldn't be used in constexpr scenarios. But who cares abo=
ut little things like <i>usability</i> and having a reasonable interface? W=
e managed to shoehorn `unique_ptr` into yet another type!<br><br>The fact t=
hat you <i>can</i> implement something one way does not mean you <i>should<=
/i>. Just because an extensibility hook exists does not mean you should emp=
loy it in <i>every possible </i>circumstance.<br></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.<br />
To post to this group, send email to std-proposals@isocpp.org.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/?hl=3Den">http://groups.google.com/a/isocpp.org/group/std-pro=
posals/?hl=3Den</a>.<br />
<br />
<br />
------=_Part_252_19432355.1361166544968--
.
Author: Andrew Sandoval <sandoval@netwaysglobal.com>
Date: Mon, 18 Feb 2013 07:54:38 -0800 (PST)
Raw View
------=_Part_86_29075803.1361202878281
Content-Type: text/plain; charset=ISO-8859-1
On Saturday, February 16, 2013 3:57:09 PM UTC-6, DeadMG wrote:
>
> Well, let me see. For one, it's not a long template at all, it's actually
> exceedingly short and simple. It's *basic* C++. Secondly, everybody
> should be in the habit of using the Standard classes maximally flexibly-
> why don't you complain that you have to actually type things to pass a
> custom comparator to std::map?
>
> And finally, if the terrible tiny smidge of custom functionality bothers
> you so much, why don't you just Standardise value_deleter and unique_handle
> as I've defined them here, and eliminate unique_resource and all the rest
> because there's absolutely no need for them to exist?
>
> Generally, programmers don't like to repeat themselves implementing
>> obvious functionally.
>
>
> You mean like, how *this entire proposal* is a duplicate of unique_ptr,
> but worse?
>
This "entire proposal"? It's clear you don't like unique_resource, but how
is scoped_function / make_scoped_function in any way a duplicate of
unique_ptr?
There is undoubtedly work yet to do on this proposal, but frankly I think
your making unique_ptr out to be a golden hammer. unique_ptr is great, and
if the only thing we had to worry about were "handles", like the "opaque"
windows HANDLE, HMODULE, etc., unique_ptr would be okay -- still not great,
but okay. And as you and I have already had this discussion on the virtues
and flaws of unique_resource above I'll not repeat it here except to remind
you that unique_resource is different from the rest of the proposal because
one of its goals is to produce the tightest code possible, and it
accomplishes that using a static deleter function and a static no-delete
value. You can argue that It makes the syntax a little ugly without the
macros (and I know how you feel about those simple macros), but the fact
that I can safely use it in Windows kernel code, and in places that bloat
can't be tolerated gives it value over the other RAII wrappers and
unique_ptr. Value, that others can benefit from. It's better to have many
tools in a tool chest than to have to try to make your hammer's claw work
as a screw driver -- despite the fact that you can probably do it.
-Andrew Sandoval
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en.
------=_Part_86_29075803.1361202878281
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
On Saturday, February 16, 2013 3:57:09 PM UTC-6, DeadMG wrote:<blockquote c=
lass=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px=
#ccc solid;padding-left: 1ex;">Well, let me see. For one, it's not a long =
template at all, it's actually exceedingly short and simple. It's <i>basic<=
/i> C++. Secondly, everybody should be in the habit of using the Standard c=
lasses maximally flexibly- why don't you complain that you have to actually=
type things to pass a custom comparator to std::map?<div><br></div><div>An=
d finally, if the terrible tiny smidge of custom functionality bothers you =
so much, why don't you just Standardise value_deleter and unique_handle as =
I've defined them here, and eliminate unique_resource and all the rest beca=
use there's absolutely no need for them to exist? </div><div><br></div=
><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border=
-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;=
padding-left:1ex">Generally, programmers don't like to repeat themselves im=
plementing obvious functionally.</blockquote><div><br></div><div>You mean l=
ike, how <i>this entire proposal</i> is a duplicate of unique_ptr, but=
worse? </div></blockquote><div><br>This "entire proposal"? It's=
clear you don't like unique_resource, but how is scoped_function / make_sc=
oped_function in any way a duplicate of unique_ptr?<br><br>There is undoubt=
edly work yet to do on this proposal, but frankly I think your making uniqu=
e_ptr out to be a golden hammer. unique_ptr is great, and if the only=
thing we had to worry about were "handles", like the "opaque" windows HAND=
LE, HMODULE, etc., unique_ptr would be okay -- still not great, but okay.&n=
bsp; And as you and I have already had this discussion on the virtues and f=
laws of unique_resource above I'll not repeat it here except to remind you =
that unique_resource is different from the rest of the proposal because one=
of its goals is to produce the tightest code possible, and it accomplishes=
that using a static deleter function and a static no-delete value. Y=
ou can argue that It makes the syntax a little ugly without the macros (and=
I know how you feel about those simple macros), but the fact that I can sa=
fely use it in Windows kernel code, and in places that bloat can't be toler=
ated gives it value over the other RAII wrappers and unique_ptr. Valu=
e, that others can benefit from. It's better to have many tools in a =
tool chest than to have to try to make your hammer's claw work as a screw d=
river -- despite the fact that you can probably do it.<br><br>-Andrew Sando=
val<br></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.<br />
To post to this group, send email to std-proposals@isocpp.org.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/?hl=3Den">http://groups.google.com/a/isocpp.org/group/std-pro=
posals/?hl=3Den</a>.<br />
<br />
<br />
------=_Part_86_29075803.1361202878281--
.
Author: francisco.mailing.lists@oblita.com
Date: Mon, 18 Feb 2013 08:40:20 -0800 (PST)
Raw View
------=_Part_220_11418611.1361205620529
Content-Type: text/plain; charset=ISO-8859-1
Guys, let's take a recess for a moment (prosecutors and defendants).
The current proposal offers special treatment, in the interface, for
specific values of non valid handles values, even providing use for
exceptions etc.
Handles can even take not only a single invalid value, but more than one or
a range. I wonder whether it would be better for the interface to try to
deal with this, instead of the constrained treatment for specific invalid
cases, maybe eliminating this more specific option if a general approach
achieves a good usability.
http://stackoverflow.com/a/3905643
https://github.com/adobe/chromium/blob/master/base/win/scoped_handle.h
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en.
------=_Part_220_11418611.1361205620529
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Guys, let's take a recess for a moment (prosecutors and defendants).<div><b=
r></div><div>The current proposal offers special treatment, in the interfac=
e, for specific values of non valid handles values, even providing use for =
exceptions etc.</div><div><br></div><div>Handles can even take not only a s=
ingle invalid value, but more than one or a range. I wonder whether it woul=
d be better for the interface to try to deal with this, instead of the cons=
trained treatment for specific invalid cases, maybe eliminating this more s=
pecific option if a general approach achieves a good usability.</div><div><=
br></div><div>http://stackoverflow.com/a/3905643<br></div><div><br></div><d=
iv>https://github.com/adobe/chromium/blob/master/base/win/scoped_handle.h<b=
r></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.<br />
To post to this group, send email to std-proposals@isocpp.org.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/?hl=3Den">http://groups.google.com/a/isocpp.org/group/std-pro=
posals/?hl=3Den</a>.<br />
<br />
<br />
------=_Part_220_11418611.1361205620529--
.
Author: francisco.mailing.lists@oblita.com
Date: Mon, 18 Feb 2013 11:57:25 -0800 (PST)
Raw View
------=_Part_1076_3480689.1361217445859
Content-Type: text/plain; charset=ISO-8859-1
Also, I personally don't like much "unique*_resource*", I think the term *
resource* is too general, resources are managed both in pointer-like as in
handle-like semantics. Most wrappers I've seen name it "something*_handle*".
I think it's best since what's being trying to attain is the semantics of
handles. The wrapper impersonates a handle.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en.
------=_Part_1076_3480689.1361217445859
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Also, I personally don't like much "unique<b>_resource</b>", I think the te=
rm <b>resource</b> is too general, resources are managed both in =
pointer-like as in handle-like semantics. Most wrappers I've seen name it "=
something<b>_handle</b>". I think it's best since what's being trying to at=
tain is the semantics of handles. The wrapper impersonates a handle.
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.<br />
To post to this group, send email to std-proposals@isocpp.org.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/?hl=3Den">http://groups.google.com/a/isocpp.org/group/std-pro=
posals/?hl=3Den</a>.<br />
<br />
<br />
------=_Part_1076_3480689.1361217445859--
.
Author: francisco.mailing.lists@oblita.com
Date: Mon, 18 Feb 2013 12:58:48 -0800 (PST)
Raw View
------=_Part_18_19986581.1361221128088
Content-Type: text/plain; charset=ISO-8859-1
Em segunda-feira, 18 de fevereiro de 2013 13h40min20s UTC-3,
francisco.m...@oblita.com escreveu:
> Guys, let's take a recess for a moment (prosecutors and defendants).
>
> The current proposal offers special treatment, in the interface, for
> specific values of non valid handles values, even providing use for
> exceptions etc.
>
> Handles can even take not only a single invalid value, but more than one
> or a range. I wonder whether it would be better for the interface to try to
> deal with this, instead of the constrained treatment for specific invalid
> cases, maybe eliminating this more specific option if a general approach
> achieves a good usability.
>
> http://stackoverflow.com/a/3905643
>
> https://github.com/adobe/chromium/blob/master/base/win/scoped_handle.h
>
Why not build towards a predicate, with true: "valid handle, should be
released on end of scope", and false: "non-valid, should not". Providing
default predicates for the most common cases, null handle and unchecked.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en.
------=_Part_18_19986581.1361221128088
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Em segunda-feira, 18 de fevereiro de 2013 13h40min20s UTC-3, francisco.m...=
@oblita.com escreveu:<br><blockquote class=3D"gmail_quote" style=3D"margin=
: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;">Guys=
, let's take a recess for a moment (prosecutors and defendants).<div><br></=
div><div>The current proposal offers special treatment, in the interface, f=
or specific values of non valid handles values, even providing use for exce=
ptions etc.</div><div><br></div><div>Handles can even take not only a singl=
e invalid value, but more than one or a range. I wonder whether it would be=
better for the interface to try to deal with this, instead of the constrai=
ned treatment for specific invalid cases, maybe eliminating this more speci=
fic option if a general approach achieves a good usability.</div><div><br><=
/div><div><a href=3D"http://stackoverflow.com/a/3905643" target=3D"_blank">=
http://stackoverflow.com/a/<wbr>3905643</a><br></div><div><br></div><div><a=
href=3D"https://github.com/adobe/chromium/blob/master/base/win/scoped_hand=
le.h" target=3D"_blank">https://github.com/adobe/<wbr>chromium/blob/master/=
base/win/<wbr>scoped_handle.h</a></div></blockquote><div><br></div><div>Why=
not build towards a predicate, with true: "valid handle, should be release=
d on end of scope", and false: "non-valid, should not". Providing default p=
redicates for the most common cases, null handle and unchecked.</div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.<br />
To post to this group, send email to std-proposals@isocpp.org.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/?hl=3Den">http://groups.google.com/a/isocpp.org/group/std-pro=
posals/?hl=3Den</a>.<br />
<br />
<br />
------=_Part_18_19986581.1361221128088--
.
Author: Andrew Sandoval <sandoval@netwaysglobal.com>
Date: Mon, 18 Feb 2013 17:28:45 -0800 (PST)
Raw View
------=_Part_1760_23824903.1361237325957
Content-Type: text/plain; charset=ISO-8859-1
On Monday, February 18, 2013 10:40:20 AM UTC-6, francisco.m...@oblita.com
wrote:
>
> Guys, let's take a recess for a moment (prosecutors and defendants).
>
> The current proposal offers special treatment, in the interface, for
> specific values of non valid handles values, even providing use for
> exceptions etc.
>
> Handles can even take not only a single invalid value, but more than one
> or a range. I wonder whether it would be better for the interface to try to
> deal with this, instead of the constrained treatment for specific invalid
> cases, maybe eliminating this more specific option if a general approach
> achieves a good usability.
>
> http://stackoverflow.com/a/3905643
>
> https://github.com/adobe/chromium/blob/master/base/win/scoped_handle.h
>
I may be misunderstanding you, but the links you point out suggest code
that should not be used and is very Windows specific. Also, I don't think
the handling of Windows HANDLEs in the scoped_handle.h example is
appropriate. Depending on how an API is implemented, zero (0) can be a
valid handle value, and so could -1. When writing Windows specific code
you must check the documentation. While it isn't likely to get back a
zero, for something that documents INVALID_HANDLE_VALUE (-1) as a failed
handle value (something I assume they did to be somewhat compatible with
C), or a -1 for something that documents zero, it is entirely possible for
an API to return those values and honor them -- for them to have meaning.
A template solution is ideal.
Keep in mind that my proposal isn't about dealing with Windows HANDLE
values. If it was I'd by on DeadMG's side on this and say just use
unique_ptr except in the cases where you need tighter code. It's not
though, its meant to be generic. And,by being generic it is meant to find
much broader use that will in turn solve many problems in the code bases
I've worked on over the years. Problems like code not being setup to
properly unwind, either because the author didn't understand the risk, or
because there was no convenient way to properly wrap things so that unwind
would function properly, etc.
I'm not inclined to break this up into 3 (or 4) different proposals, but if
unique_resource is going to be the hang up, maybe I should...?
-Andrew Sandoval
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en.
------=_Part_1760_23824903.1361237325957
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
On Monday, February 18, 2013 10:40:20 AM UTC-6, francisco.m...@oblita.com w=
rote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8e=
x;border-left: 1px #ccc solid;padding-left: 1ex;">Guys, let's take a recess=
for a moment (prosecutors and defendants).<div><br></div><div>The current =
proposal offers special treatment, in the interface, for specific values of=
non valid handles values, even providing use for exceptions etc.</div><div=
><br></div><div>Handles can even take not only a single invalid value, but =
more than one or a range. I wonder whether it would be better for the inter=
face to try to deal with this, instead of the constrained treatment for spe=
cific invalid cases, maybe eliminating this more specific option if a gener=
al approach achieves a good usability.</div><div><br></div><div><a href=3D"=
http://stackoverflow.com/a/3905643" target=3D"_blank">http://stackoverflow.=
com/a/<wbr>3905643</a><br></div><div><br></div><div><a href=3D"https://gith=
ub.com/adobe/chromium/blob/master/base/win/scoped_handle.h" target=3D"_blan=
k">https://github.com/adobe/<wbr>chromium/blob/master/base/win/<wbr>scoped_=
handle.h</a><br></div></blockquote><div><br>I may be misunderstanding you, =
but the links you point out suggest code that should not be used and is ver=
y Windows specific. Also, I don't think the handling of Windows HANDL=
Es in the scoped_handle.h example is appropriate. Depending on how an=
API is implemented, zero (0) can be a valid handle value, and so could -1.=
When writing Windows specific code you must check the documentation.=
While it isn't likely to get back a zero, for something that documen=
ts INVALID_HANDLE_VALUE (-1) as a failed handle value (something I assume t=
hey did to be somewhat compatible with C), or a -1 for something that docum=
ents zero, it is entirely possible for an API to return those values and ho=
nor them -- for them to have meaning. A template solution is ideal.<b=
r><br>Keep in mind that my proposal isn't about dealing with Windows HANDLE=
values. If it was I'd by on DeadMG's side on this and say just use u=
nique_ptr except in the cases where you need tighter code. It's not t=
hough, its meant to be generic. And,by being generic it is meant to f=
ind much broader use that will in turn solve many problems in the code base=
s I've worked on over the years. Problems like code not being setup t=
o properly unwind, either because the author didn't understand the risk, or=
because there was no convenient way to properly wrap things so that unwind=
would function properly, etc.<br><br>I'm not inclined to break this up int=
o 3 (or 4) different proposals, but if unique_resource is going to be the h=
ang up, maybe I should...?<br><br>-Andrew Sandoval<br></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.<br />
To post to this group, send email to std-proposals@isocpp.org.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/?hl=3Den">http://groups.google.com/a/isocpp.org/group/std-pro=
posals/?hl=3Den</a>.<br />
<br />
<br />
------=_Part_1760_23824903.1361237325957--
.
Author: DeadMG <wolfeinstein@gmail.com>
Date: Mon, 18 Feb 2013 17:28:57 -0800 (PST)
Raw View
------=_Part_130_6671089.1361237337375
Content-Type: text/plain; charset=ISO-8859-1
On Monday, February 18, 2013 3:54:38 PM UTC, Andrew Sandoval wrote:
> On Saturday, February 16, 2013 3:57:09 PM UTC-6, DeadMG wrote:
>>
>> Well, let me see. For one, it's not a long template at all, it's actually
>> exceedingly short and simple. It's *basic* C++. Secondly, everybody
>> should be in the habit of using the Standard classes maximally flexibly-
>> why don't you complain that you have to actually type things to pass a
>> custom comparator to std::map?
>>
>> And finally, if the terrible tiny smidge of custom functionality bothers
>> you so much, why don't you just Standardise value_deleter and unique_handle
>> as I've defined them here, and eliminate unique_resource and all the rest
>> because there's absolutely no need for them to exist?
>>
>> Generally, programmers don't like to repeat themselves implementing
>>> obvious functionally.
>>
>>
>> You mean like, how *this entire proposal* is a duplicate of unique_ptr,
>> but worse?
>>
>
> This "entire proposal"? It's clear you don't like unique_resource, but
> how is scoped_function / make_scoped_function in any way a duplicate of
> unique_ptr?
>
Are you really implying that I can't approximate scoped_function with
unique_ptr? I haven't tried, but I'm pretty sure I know which way it's
gonna go. Although it's not entirely clear exactly what that API is- for
example, your make_scoped doesn't show what T should be.
> unique_resource is different from the rest of the proposal because one of
> its goals is to produce the tightest code possible, and it accomplishes
> that using a static deleter function and a static no-delete value. You can
> argue that It makes the syntax a little ugly without the macros (and I know
> how you feel about those simple macros), but the fact that I can safely use
> it in Windows kernel code, and in places that bloat can't be tolerated
> gives it value over the other RAII wrappers and unique_ptr. Value, that
> others can benefit from.
I agree. It's called, "Your implementation did a partial specialization for
value_deleter for you.". It's a QoI issue, not something the Committee
should be looking at. After all, even if the proposal goes through
unaltered, there's still no guarantee at all that your implementer actually
did anything different for unique_resource, and did not implement it by
simply forwarding to unique_ptr (as a member, not as an alias as I would,
but still). Either way, you are still completely dependent on your
implementer to solve this problem. Not to mention the nicheness of kernel
mode and such things.
And why do we want them to be uniform with pointers?
Well, firstly, since they are pointers, then it's just cleaner to treat
them like pointers, and secondly, we can save ourselves a whole bunch of
hassle by treating them uniformly. Say, not having to re-invent unique_ptr.
Nobody is going to create a template function that takes a `unique_ptr<T,
> D>` which works correctly with both handles and pointers.
Really? Because I'm pretty sure that anybody who took a `unique_ptr<T, D>`
who used it in a fashion compatible with a pointer to incomplete type, will
also have made it completely compatible with handles. For example...
std::hash, and it's friends like greater and equal_to. Another example is a
"dereferencing" functor, similar to std::greater. These are pretty common,
but you can't go back and order up an extra specialization for them for
unique_resource. But I can specify compatibility with them.
`unique_ptr` has interfaces dedicated to accessing that langauge-level
> support. It's *very* relevant, because those interfaces no longer work.
That's immaterial, because there are plenty of ways of using unique_ptr
that don't require them in the first place- and plenty of use cases for
unique ptr (see incomplete types, for example) where they also could not be
supported. There's no loss here, much as there's no loss storing unique_ptr
in std::vector, even though std::vector has a copy constructor.
Ignoring the fact that resize() works on non-copyable `T`s
Yes, somewhat embarassing. Wasn't it specced in C++03 to copy the last
element or copy a default-constructed T or something? Oh well. Copy
constructor is enough.
In short, `vector` is simply forwarding those restrictions to you.
And I am forwarding the restrictions of handles to you. If you have a POSIX
file-descriptor, or void*, then -> isn't gonna work, just as before.
Sounds like it is for managing the lifetime of a *pointer* to me.
Of course, since handles are pointers, then I'm glad we agree that handles
are perfectly valid and intended. On the other hand, while this is fun, I
refer back to my original statement on this topic, namely,
> Firstly, screw what it's meant for. It is perfectly capable of serving
> this purpose in every way. Templates were never meant to be
> Turing-Complete, and we were never meant to use expression templates, and
> Alexander Fleming never meant to discover antibiotics. But that never
> stopped them from happening, and being good or bad things irrelevant of
> whether or not they were meant to happen.
> And secondly, the authors of unique_ptr *meant* for it to be customizable
> with the pointer typedef. If it was only meant for use with raw pointers...
> why offer the typedef?
We can bitch all day about what unique_ptr was meant for, but it's
ultimately irrelevant.
I mean, you could re-implement shared_ptr in terms of unique_ptr, if you
> expanded unique_ptr's interface.
Is *exactly* what I would have done. All you would need is a flag in the
deleter telling the unique_ptr that it is safe for copying- if even that,
in the presence of type traits. Not having this functionality is also
supremely irritating. If shared_ptr were implemented this way, we could do
something like std::unique_ptr<T, std::function<void(T*)>> to take a
pointer to any object, regardless of it's ownership schemes, which would be
nice.
No abstraction is perfect, true. But my point is that *you don't need an
> abstraction here*.
I think you misunderstand me. I don't think that there is anything wrong
whatsoever with
auto handle = p.get();
stat(*handle, ...);
The only irrelevance I was referring to was the name of the type. This
interface fits in just fine with the abstraction I intended.
Oh sure, the `get` method will return a wrapper instead of a `T&`.
IYAM, a pointer-alike type would actually be better than T&. Then, get()
would have a much more uniform interface, rather than "Hey guise, T* on
shared_ptr and unique_ptr and auto_ptr but nyahahahaha fuck you T& on
optional!". But regardless, you couldn't really deal with optional<T> in
terms of unique_ptr, even disregarding the copyability issue, I think. I
never really considered it, but it might actually be possible. You'd end up
with the constructor requiring too many implicit conversions, I think.
Thanks for this suggestion.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en.
------=_Part_130_6671089.1361237337375
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
On Monday, February 18, 2013 3:54:38 PM UTC, Andrew Sandoval wrote:<br><blo=
ckquote class=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; border-le=
ft-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: so=
lid; padding-left: 1ex;">On Saturday, February 16, 2013 3:57:09 PM UTC-6, D=
eadMG wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0px 0px 0px =
0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); borde=
r-left-style: solid; padding-left: 1ex;">Well, let me see. For one, it's no=
t a long template at all, it's actually exceedingly short and simple. It's&=
nbsp;<i>basic</i> C++. Secondly, everybody should be in the habit of u=
sing the Standard classes maximally flexibly- why don't you complain that y=
ou have to actually type things to pass a custom comparator to std::map?<di=
v><br></div><div>And finally, if the terrible tiny smidge of custom functio=
nality bothers you so much, why don't you just Standardise value_deleter an=
d unique_handle as I've defined them here, and eliminate unique_resource an=
d all the rest because there's absolutely no need for them to exist? <=
/div><div><br></div><blockquote class=3D"gmail_quote" style=3D"margin: 0px =
0px 0px 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204=
); border-left-style: solid; padding-left: 1ex;">Generally, programmers don=
't like to repeat themselves implementing obvious functionally.</blockquote=
><div><br></div><div>You mean like, how <i>this entire proposal</i>&nb=
sp;is a duplicate of unique_ptr, but worse? </div></blockquote><div><b=
r>This "entire proposal"? It's clear you don't like unique_resource, =
but how is scoped_function / make_scoped_function in any way a duplicate of=
unique_ptr?<br></div></blockquote><div><br></div><div>Are you really imply=
ing that I can't approximate scoped_function with unique_ptr? I haven't tri=
ed, but I'm pretty sure I know which way it's gonna go. Although it's not e=
ntirely clear exactly what that API is- for example, your make_scoped doesn=
't show what T should be. </div><div> </div><blockquote class=3D"=
gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; border-left-width: 1px; bo=
rder-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left=
: 1ex;">unique_resource is different from the rest of the proposal because =
one of its goals is to produce the tightest code possible, and it accomplis=
hes that using a static deleter function and a static no-delete value. =
; You can argue that It makes the syntax a little ugly without the macros (=
and I know how you feel about those simple macros), but the fact that I can=
safely use it in Windows kernel code, and in places that bloat can't be to=
lerated gives it value over the other RAII wrappers and unique_ptr. V=
alue, that others can benefit from.</blockquote><div><br></div><div>I agree=
.. It's called, "Your implementation did a partial specialization for value_=
deleter for you.". It's a QoI issue, not something the Committee should be =
looking at. After all, even if the proposal goes through unaltered, there's=
still no guarantee at all that your implementer actually did anything diff=
erent for unique_resource, and did not implement it by simply forwarding to=
unique_ptr (as a member, not as an alias as I would, but still). Either wa=
y, you are still completely dependent on your implementer to solve this pro=
blem. Not to mention the nicheness of kernel mode and such things.</div><di=
v><br></div><blockquote class=3D"gmail_quote" style=3D"margin: 0px 0px 0px =
0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); borde=
r-left-style: solid; padding-left: 1ex;">And why do we want them to be unif=
orm with pointers?</blockquote><div><br></div><div>Well, firstly, since the=
y are pointers, then it's just cleaner to treat them like pointers, and sec=
ondly, we can save ourselves a whole bunch of hassle by treating them unifo=
rmly. Say, not having to re-invent unique_ptr.</div><div><br></div><blockqu=
ote class=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; border-left-w=
idth: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid;=
padding-left: 1ex;">Nobody is going to create a template function that tak=
es a `unique_ptr<T, D>` which works correctly with both handles and p=
ointers. </blockquote><div><br></div><div>Really? Because I'm pretty s=
ure that anybody who took a `unique_ptr<T, D>` who used it in a fashi=
on compatible with a pointer to incomplete type, will also have made it com=
pletely compatible with handles. For example... std::hash, and it's friends=
like greater and equal_to. Another example is a "dereferencing" functor, s=
imilar to std::greater. These are pretty common, but you can't go back and =
order up an extra specialization for them for unique_resource. But I can sp=
ecify compatibility with them.</div><div><br></div><blockquote class=3D"gma=
il_quote" style=3D"margin: 0px 0px 0px 0.8ex; border-left-width: 1px; borde=
r-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1=
ex;">`unique_ptr` has interfaces dedicated to accessing that langauge-level=
support. It's <i>very</i> relevant, because those interfaces no =
longer work.</blockquote><div><br></div><div>That's immaterial, because the=
re are plenty of ways of using unique_ptr that don't require them in the fi=
rst place- and plenty of use cases for unique ptr (see incomplete types, fo=
r example) where they also could not be supported. There's no loss here, mu=
ch as there's no loss storing unique_ptr in std::vector, even though std::v=
ector has a copy constructor.</div><div><br></div><blockquote class=3D"gmai=
l_quote" style=3D"margin: 0px 0px 0px 0.8ex; border-left-width: 1px; border=
-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1e=
x;">Ignoring the fact that resize() works on non-copyable `T`s</blockquote>=
<div><br></div><div>Yes, somewhat embarassing. Wasn't it specced in C++03 t=
o copy the last element or copy a default-constructed T or something? Oh we=
ll. Copy constructor is enough. </div><div><br></div><blockquote class=
=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; border-left-width: 1px=
; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-=
left: 1ex;"> In short, `vector` is simply forwarding those restriction=
s to you.</blockquote><div><br></div><div>And I am forwarding the restricti=
ons of handles to you. If you have a POSIX file-descriptor, or void*, then =
-> isn't gonna work, just as before.</div><div><br></div><blockquote cla=
ss=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; border-left-width: 1=
px; border-left-color: rgb(204, 204, 204); border-left-style: solid; paddin=
g-left: 1ex;">Sounds like it is for managing the lifetime of a <i>poin=
ter</i> to me.</blockquote><div><br></div><div>Of course, since handle=
s are pointers, then I'm glad we agree that handles are perfectly valid and=
intended. On the other hand, while this is fun, I refer back to my origina=
l statement on this topic, namely,</div><div> </div><blockquote class=
=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; border-left-width: 1px=
; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-=
left: 1ex;">Firstly, screw what it's meant for. It is perfectly capable of =
serving this purpose in every way. Templates were never meant to be Turing-=
Complete, and we were never meant to use expression templates, and Alexande=
r Fleming never meant to discover antibiotics. But that never stopped them =
from happening, and being good or bad things irrelevant of whether or not t=
hey were meant to happen.<br>And secondly, the authors of unique_ptr <=
i>meant</i> for it to be customizable with the pointer typedef. If it =
was only meant for use with raw pointers... why offer the typedef?</blockqu=
ote><div><br></div><div>We can bitch all day about what unique_ptr was mean=
t for, but it's ultimately irrelevant.</div><div><br></div><blockquote clas=
s=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; border-left-width: 1p=
x; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding=
-left: 1ex;">I mean, you could re-implement shared_ptr in terms of unique_p=
tr, if you expanded unique_ptr's interface.</blockquote><div><br></div><div=
>Is <i>exactly</i> what I would have done. All you would need is a fla=
g in the deleter telling the unique_ptr that it is safe for copying- if eve=
n that, in the presence of type traits. Not having this functionality is al=
so supremely irritating. If shared_ptr were implemented this way, we could =
do something like std::unique_ptr<T, std::function<void(T*)>> t=
o take a pointer to any object, regardless of it's ownership schemes, which=
would be nice.</div><div><br></div><blockquote class=3D"gmail_quote" style=
=3D"margin: 0px 0px 0px 0.8ex; border-left-width: 1px; border-left-color: r=
gb(204, 204, 204); border-left-style: solid; padding-left: 1ex;">No abstrac=
tion is perfect, true. But my point is that <i>you don't need an abstr=
action here</i>.</blockquote><div><br></div><div>I think you misunderstand =
me. I don't think that there is anything wrong whatsoever with </div><=
div><br></div><div style=3D"background-color: rgb(250, 250, 250); border: 1=
px solid rgb(187, 187, 187); word-wrap: break-word;" class=3D"prettyprint">=
<code class=3D"prettyprint"><div class=3D"subprettyprint"><span style=3D"co=
lor: #008;" class=3D"styled-by-prettify">auto</span><span style=3D"color: #=
000;" class=3D"styled-by-prettify"> handle </span><span style=3D"color: #66=
0;" class=3D"styled-by-prettify">=3D</span><span style=3D"color: #000;" cla=
ss=3D"styled-by-prettify"> p</span><span style=3D"color: #660;" class=3D"st=
yled-by-prettify">.</span><span style=3D"color: #008;" class=3D"styled-by-p=
rettify">get</span><span style=3D"color: #660;" class=3D"styled-by-prettify=
">();</span><span style=3D"color: #000;" class=3D"styled-by-prettify"><br>s=
tat</span><span style=3D"color: #660;" class=3D"styled-by-prettify">(*</spa=
n><span style=3D"color: #000;" class=3D"styled-by-prettify">handle</span><s=
pan style=3D"color: #660;" class=3D"styled-by-prettify">,</span><span style=
=3D"color: #000;" class=3D"styled-by-prettify"> </span><span style=3D"color=
: #660;" class=3D"styled-by-prettify">...);</span></div></code></div><div><=
br></div><div>The only irrelevance I was referring to was the name of the t=
ype. This interface fits in just fine with the abstraction I intended.</div=
><div><br></div><div><blockquote class=3D"gmail_quote" style=3D"margin: 0px=
0px 0px 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 20=
4); border-left-style: solid; padding-left: 1ex;"> Oh sure, the `get` =
method will return a wrapper instead of a `T&`.</blockquote><div><br></=
div><div>IYAM, a pointer-alike type would actually be better than T&. T=
hen, get() would have a much more uniform interface, rather than "Hey guise=
, T* on shared_ptr and unique_ptr and auto_ptr but nyahahahaha fuck you T&a=
mp; on optional!". But regardless, you couldn't really deal with optional&l=
t;T> in terms of unique_ptr, even disregarding the copyability issue, I =
think. I never really considered it, but it might actually be possible. You=
'd end up with the constructor requiring too many implicit conversions, I t=
hink. Thanks for this suggestion.</div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.<br />
To post to this group, send email to std-proposals@isocpp.org.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/?hl=3Den">http://groups.google.com/a/isocpp.org/group/std-pro=
posals/?hl=3Den</a>.<br />
<br />
<br />
------=_Part_130_6671089.1361237337375--
.
Author: francisco.mailing.lists@oblita.com
Date: Mon, 18 Feb 2013 17:34:06 -0800 (PST)
Raw View
------=_Part_1569_12248911.1361237646118
Content-Type: text/plain; charset=ISO-8859-1
Em segunda-feira, 18 de fevereiro de 2013 22h28min45s UTC-3, Andrew
Sandoval escreveu:
>
> On Monday, February 18, 2013 10:40:20 AM UTC-6, francisco.m...@oblita.comwrote:
>>
>> Guys, let's take a recess for a moment (prosecutors and defendants).
>>
>> The current proposal offers special treatment, in the interface, for
>> specific values of non valid handles values, even providing use for
>> exceptions etc.
>>
>> Handles can even take not only a single invalid value, but more than one
>> or a range. I wonder whether it would be better for the interface to try to
>> deal with this, instead of the constrained treatment for specific invalid
>> cases, maybe eliminating this more specific option if a general approach
>> achieves a good usability.
>>
>> http://stackoverflow.com/a/3905643
>>
>> https://github.com/adobe/chromium/blob/master/base/win/scoped_handle.h
>>
>
> I may be misunderstanding you, but the links you point out suggest code
> that should not be used and is very Windows specific. Also, I don't think
> the handling of Windows HANDLEs in the scoped_handle.h example is
> appropriate. Depending on how an API is implemented, zero (0) can be a
> valid handle value, and so could -1. When writing Windows specific code
> you must check the documentation. While it isn't likely to get back a
> zero, for something that documents INVALID_HANDLE_VALUE (-1) as a failed
> handle value (something I assume they did to be somewhat compatible with
> C), or a -1 for something that documents zero, it is entirely possible for
> an API to return those values and honor them -- for them to have meaning.
> A template solution is ideal.
>
> Keep in mind that my proposal isn't about dealing with Windows HANDLE
> values. If it was I'd by on DeadMG's side on this and say just use
> unique_ptr except in the cases where you need tighter code. It's not
> though, its meant to be generic. And,by being generic it is meant to find
> much broader use that will in turn solve many problems in the code bases
> I've worked on over the years. Problems like code not being setup to
> properly unwind, either because the author didn't understand the risk, or
> because there was no convenient way to properly wrap things so that unwind
> would function properly, etc.
>
> I'm not inclined to break this up into 3 (or 4) different proposals, but
> if unique_resource is going to be the hang up, maybe I should...?
>
> -Andrew Sandoval
>
I guess you misunderstood me, I'm not being Windows specific, it's was just
to illustrate handle semantics. Building an interface towards specific
invalid handle values seems not to cover well handle semantics, were a
handle type may achieve a range of invalid values.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en.
------=_Part_1569_12248911.1361237646118
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
<br><br>Em segunda-feira, 18 de fevereiro de 2013 22h28min45s UTC-3, Andrew=
Sandoval escreveu:<blockquote class=3D"gmail_quote" style=3D"margin: 0;ma=
rgin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;">On Monday,=
February 18, 2013 10:40:20 AM UTC-6, <a>francisco.m...@oblita.com</a> wrot=
e:<blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;bor=
der-left:1px #ccc solid;padding-left:1ex">Guys, let's take a recess for a m=
oment (prosecutors and defendants).<div><br></div><div>The current proposal=
offers special treatment, in the interface, for specific values of non val=
id handles values, even providing use for exceptions etc.</div><div><br></d=
iv><div>Handles can even take not only a single invalid value, but more tha=
n one or a range. I wonder whether it would be better for the interface to =
try to deal with this, instead of the constrained treatment for specific in=
valid cases, maybe eliminating this more specific option if a general appro=
ach achieves a good usability.</div><div><br></div><div><a href=3D"http://s=
tackoverflow.com/a/3905643" target=3D"_blank">http://stackoverflow.com/a/<w=
br>3905643</a><br></div><div><br></div><div><a href=3D"https://github.com/a=
dobe/chromium/blob/master/base/win/scoped_handle.h" target=3D"_blank">https=
://github.com/adobe/<wbr>chromium/blob/master/base/win/<wbr>scoped_handle.h=
</a><br></div></blockquote><div><br>I may be misunderstanding you, but the =
links you point out suggest code that should not be used and is very Window=
s specific. Also, I don't think the handling of Windows HANDLEs in th=
e scoped_handle.h example is appropriate. Depending on how an API is =
implemented, zero (0) can be a valid handle value, and so could -1. W=
hen writing Windows specific code you must check the documentation. W=
hile it isn't likely to get back a zero, for something that documents INVAL=
ID_HANDLE_VALUE (-1) as a failed handle value (something I assume they did =
to be somewhat compatible with C), or a -1 for something that documents zer=
o, it is entirely possible for an API to return those values and honor them=
-- for them to have meaning. A template solution is ideal.<br><br>Ke=
ep in mind that my proposal isn't about dealing with Windows HANDLE values.=
If it was I'd by on DeadMG's side on this and say just use unique_pt=
r except in the cases where you need tighter code. It's not though, i=
ts meant to be generic. And,by being generic it is meant to find much=
broader use that will in turn solve many problems in the code bases I've w=
orked on over the years. Problems like code not being setup to proper=
ly unwind, either because the author didn't understand the risk, or because=
there was no convenient way to properly wrap things so that unwind would f=
unction properly, etc.<br><br>I'm not inclined to break this up into 3 (or =
4) different proposals, but if unique_resource is going to be the hang up, =
maybe I should...?<br><br>-Andrew Sandoval<br></div></blockquote><div><br><=
/div><div>I guess you misunderstood me, I'm not being Windows specific, it'=
s was just to illustrate handle semantics. Building an interface towards sp=
ecific invalid handle values seems not to cover well handle semantics, were=
a handle type may achieve a range of invalid values.</div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.<br />
To post to this group, send email to std-proposals@isocpp.org.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/?hl=3Den">http://groups.google.com/a/isocpp.org/group/std-pro=
posals/?hl=3Den</a>.<br />
<br />
<br />
------=_Part_1569_12248911.1361237646118--
.
Author: francisco.mailing.lists@oblita.com
Date: Mon, 18 Feb 2013 17:41:51 -0800 (PST)
Raw View
------=_Part_1112_7864147.1361238111267
Content-Type: text/plain; charset=ISO-8859-1
Em segunda-feira, 18 de fevereiro de 2013 22h34min06s UTC-3,
francisco.m...@oblita.com escreveu:
> I guess you misunderstood me, I'm not being Windows specific, it's was
> just to illustrate handle semantics. Building an interface towards specific
> invalid handle values seems not to cover well handle semantics, were a
> handle type may achieve a range of invalid values.
>
s/were/where/
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en.
------=_Part_1112_7864147.1361238111267
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Em segunda-feira, 18 de fevereiro de 2013 22h34min06s UTC-3, francisco.m...=
@oblita.com escreveu:<br><blockquote class=3D"gmail_quote" style=3D"margin=
: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;">I gu=
ess you misunderstood me, I'm not being Windows specific, it's was just to =
illustrate handle semantics. Building an interface towards specific invalid=
handle values seems not to cover well handle semantics, were a handle type=
may achieve a range of invalid values.<br></blockquote><div><br></div><div=
>s/were/where/</div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.<br />
To post to this group, send email to std-proposals@isocpp.org.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/?hl=3Den">http://groups.google.com/a/isocpp.org/group/std-pro=
posals/?hl=3Den</a>.<br />
<br />
<br />
------=_Part_1112_7864147.1361238111267--
.
Author: Andrew Sandoval <sandoval@netwaysglobal.com>
Date: Mon, 18 Feb 2013 17:45:55 -0800 (PST)
Raw View
------=_Part_898_278877.1361238355728
Content-Type: text/plain; charset=ISO-8859-1
On Monday, February 18, 2013 7:28:57 PM UTC-6, DeadMG wrote:
>
> On Monday, February 18, 2013 3:54:38 PM UTC, Andrew Sandoval wrote:
>
>> On Saturday, February 16, 2013 3:57:09 PM UTC-6, DeadMG wrote:
>>>
>>> Well, let me see. For one, it's not a long template at all, it's
>>> actually exceedingly short and simple. It's *basic* C++. Secondly,
>>> everybody should be in the habit of using the Standard classes maximally
>>> flexibly- why don't you complain that you have to actually type things to
>>> pass a custom comparator to std::map?
>>>
>>> And finally, if the terrible tiny smidge of custom functionality bothers
>>> you so much, why don't you just Standardise value_deleter and unique_handle
>>> as I've defined them here, and eliminate unique_resource and all the rest
>>> because there's absolutely no need for them to exist?
>>>
>>> Generally, programmers don't like to repeat themselves implementing
>>>> obvious functionally.
>>>
>>>
>>> You mean like, how *this entire proposal* is a duplicate of unique_ptr,
>>> but worse?
>>>
>>
>> This "entire proposal"? It's clear you don't like unique_resource, but
>> how is scoped_function / make_scoped_function in any way a duplicate of
>> unique_ptr?
>>
>
> Are you really implying that I can't approximate scoped_function with
> unique_ptr? I haven't tried, but I'm pretty sure I know which way it's
> gonna go. Although it's not entirely clear exactly what that API is- for
> example, your make_scoped doesn't show what T should be.
>
No, what I'm saying is that it would be especially ugly and hackish. The
second half of your statement doesn't make sense to me.
make_scoped_function is fairly clear, and it doesn't take much imagination
to see how it can be used. Are you asking for an example?
>
>
>> unique_resource is different from the rest of the proposal because one of
>> its goals is to produce the tightest code possible, and it accomplishes
>> that using a static deleter function and a static no-delete value. You can
>> argue that It makes the syntax a little ugly without the macros (and I know
>> how you feel about those simple macros), but the fact that I can safely use
>> it in Windows kernel code, and in places that bloat can't be tolerated
>> gives it value over the other RAII wrappers and unique_ptr. Value, that
>> others can benefit from.
>
>
> I agree. It's called, "Your implementation did a partial specialization
> for value_deleter for you.". It's a QoI issue, not something the Committee
> should be looking at. After all, even if the proposal goes through
> unaltered, there's still no guarantee at all that your implementer actually
> did anything different for unique_resource, and did not implement it by
> simply forwarding to unique_ptr (as a member, not as an alias as I would,
> but still). Either way, you are still completely dependent on your
> implementer to solve this problem. Not to mention the nicheness of kernel
> mode and such things.
>
> Only if the proposal is worded to allow for that. And, the proposal as I
write it for unique_resource, *will* point out that the idea is to use
static values to minimize the size of generated code. Also, I wasn't clear
on this, but the minimized code size isn't a requirement for kernel
programming. That is just as applicable to user mode code in downloaded /
on-demand products.
The main requirement for kernel code is not throwing exceptions. Also most
driver writers will not touch C++ in part because its too much to untangle
most C++ code and template based code for them to see what happens under
the covers, and to minimize dependencies that might throw exceptions, or
allocate memory from the wrong pool, etc. Currently (and I hope it stays
that way) unique_resource, make_scoped_function, and make_scoped_resource
are satisfactory for kernel code -- which for me means I'll never have to
deal with another goto ErrorExit in my kernel code.
> And why do we want them to be uniform with pointers?
>
>
> Well, firstly, since they are pointers, then it's just cleaner to treat
> them like pointers, and secondly, we can save ourselves a whole bunch of
> hassle by treating them uniformly. Say, not having to re-invent unique_ptr.
>
> Nobody is going to create a template function that takes a `unique_ptr<T,
>> D>` which works correctly with both handles and pointers.
>
>
> Really? Because I'm pretty sure that anybody who took a `unique_ptr<T, D>`
> who used it in a fashion compatible with a pointer to incomplete type, will
> also have made it completely compatible with handles. For example...
> std::hash, and it's friends like greater and equal_to. Another example is a
> "dereferencing" functor, similar to std::greater. These are pretty common,
> but you can't go back and order up an extra specialization for them for
> unique_resource. But I can specify compatibility with them.
>
> `unique_ptr` has interfaces dedicated to accessing that langauge-level
>> support. It's *very* relevant, because those interfaces no longer work.
>
>
> That's immaterial, because there are plenty of ways of using unique_ptr
> that don't require them in the first place- and plenty of use cases for
> unique ptr (see incomplete types, for example) where they also could not be
> supported. There's no loss here, much as there's no loss storing unique_ptr
> in std::vector, even though std::vector has a copy constructor.
>
> Ignoring the fact that resize() works on non-copyable `T`s
>
>
> Yes, somewhat embarassing. Wasn't it specced in C++03 to copy the last
> element or copy a default-constructed T or something? Oh well. Copy
> constructor is enough.
>
> In short, `vector` is simply forwarding those restrictions to you.
>
>
> And I am forwarding the restrictions of handles to you. If you have a
> POSIX file-descriptor, or void*, then -> isn't gonna work, just as before.
>
> Sounds like it is for managing the lifetime of a *pointer* to me.
>
>
> Of course, since handles are pointers, then I'm glad we agree that handles
> are perfectly valid and intended. On the other hand, while this is fun, I
> refer back to my original statement on this topic, namely,
>
>
>> Firstly, screw what it's meant for. It is perfectly capable of serving
>> this purpose in every way. Templates were never meant to be
>> Turing-Complete, and we were never meant to use expression templates, and
>> Alexander Fleming never meant to discover antibiotics. But that never
>> stopped them from happening, and being good or bad things irrelevant of
>> whether or not they were meant to happen.
>> And secondly, the authors of unique_ptr *meant* for it to be
>> customizable with the pointer typedef. If it was only meant for use with
>> raw pointers... why offer the typedef?
>
>
> We can bitch all day about what unique_ptr was meant for, but it's
> ultimately irrelevant.
>
> I mean, you could re-implement shared_ptr in terms of unique_ptr, if you
>> expanded unique_ptr's interface.
>
>
> Is *exactly* what I would have done. All you would need is a flag in the
> deleter telling the unique_ptr that it is safe for copying- if even that,
> in the presence of type traits. Not having this functionality is also
> supremely irritating. If shared_ptr were implemented this way, we could do
> something like std::unique_ptr<T, std::function<void(T*)>> to take a
> pointer to any object, regardless of it's ownership schemes, which would be
> nice.
>
> No abstraction is perfect, true. But my point is that *you don't need an
>> abstraction here*.
>
>
> I think you misunderstand me. I don't think that there is anything wrong
> whatsoever with
>
> auto handle = p.get();
> stat(*handle, ...);
>
> I have to disagree with that. The second I see *handle I start worrying
about if(handle == nullptr). I shouldn't have to worry about that for a
non-pointer type.
The only irrelevance I was referring to was the name of the type. This
> interface fits in just fine with the abstraction I intended.
>
> Oh sure, the `get` method will return a wrapper instead of a `T&`.
>
>
> IYAM, a pointer-alike type would actually be better than T&. Then, get()
> would have a much more uniform interface, rather than "Hey guise, T* on
> shared_ptr and unique_ptr and auto_ptr but nyahahahaha fuck you T& on
> optional!". But regardless, you couldn't really deal with optional<T> in
> terms of unique_ptr, even disregarding the copyability issue, I think. I
> never really considered it, but it might actually be possible. You'd end up
> with the constructor requiring too many implicit conversions, I think.
> Thanks for this suggestion.
>
DeadMG: I know the argument is a big heated, but would you mind please
keeping your language under control? Using profanity doesn't strengthen
your argument -- it just makes you look weak. I'll say no more on this and
I don't expect a response, but I assure you that your comments carry far
more weight in my mind when your language doesn't paint you as an
adolescent. Thanks.
-Andrew Sandoval
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en.
------=_Part_898_278877.1361238355728
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
On Monday, February 18, 2013 7:28:57 PM UTC-6, DeadMG wrote:<blockquote cla=
ss=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #=
ccc solid;padding-left: 1ex;">On Monday, February 18, 2013 3:54:38 PM UTC, =
Andrew Sandoval wrote:<br><blockquote class=3D"gmail_quote" style=3D"margin=
:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204)=
;border-left-style:solid;padding-left:1ex">On Saturday, February 16, 2013 3=
:57:09 PM UTC-6, DeadMG wrote:<blockquote class=3D"gmail_quote" style=3D"ma=
rgin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,=
204);border-left-style:solid;padding-left:1ex">Well, let me see. For one, i=
t's not a long template at all, it's actually exceedingly short and simple.=
It's <i>basic</i> C++. Secondly, everybody should be in the habi=
t of using the Standard classes maximally flexibly- why don't you complain =
that you have to actually type things to pass a custom comparator to std::m=
ap?<div><br></div><div>And finally, if the terrible tiny smidge of custom f=
unctionality bothers you so much, why don't you just Standardise value_dele=
ter and unique_handle as I've defined them here, and eliminate unique_resou=
rce and all the rest because there's absolutely no need for them to exist?&=
nbsp;</div><div><br></div><blockquote class=3D"gmail_quote" style=3D"margin=
:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204)=
;border-left-style:solid;padding-left:1ex">Generally, programmers don't lik=
e to repeat themselves implementing obvious functionally.</blockquote><div>=
<br></div><div>You mean like, how <i>this entire proposal</i> is =
a duplicate of unique_ptr, but worse? </div></blockquote><div><br>This=
"entire proposal"? It's clear you don't like unique_resource, but ho=
w is scoped_function / make_scoped_function in any way a duplicate of uniqu=
e_ptr?<br></div></blockquote><div><br></div><div>Are you really implying th=
at I can't approximate scoped_function with unique_ptr? I haven't tried, bu=
t I'm pretty sure I know which way it's gonna go. Although it's not entirel=
y clear exactly what that API is- for example, your make_scoped doesn't sho=
w what T should be. </div></blockquote><div><br>No, what I'm saying is=
that it would be especially ugly and hackish. The second half of you=
r statement doesn't make sense to me. make_scoped_function is fairly =
clear, and it doesn't take much imagination to see how it can be used. =
; Are you asking for an example?<br></div><blockquote class=3D"gmail_quote"=
style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-=
left: 1ex;"><div> </div><blockquote class=3D"gmail_quote" style=3D"mar=
gin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,2=
04);border-left-style:solid;padding-left:1ex">unique_resource is different =
from the rest of the proposal because one of its goals is to produce the ti=
ghtest code possible, and it accomplishes that using a static deleter funct=
ion and a static no-delete value. You can argue that It makes the syn=
tax a little ugly without the macros (and I know how you feel about those s=
imple macros), but the fact that I can safely use it in Windows kernel code=
, and in places that bloat can't be tolerated gives it value over the other=
RAII wrappers and unique_ptr. Value, that others can benefit from.</=
blockquote><div><br></div><div>I agree. It's called, "Your implementation d=
id a partial specialization for value_deleter for you.". It's a QoI issue, =
not something the Committee should be looking at. After all, even if the pr=
oposal goes through unaltered, there's still no guarantee at all that your =
implementer actually did anything different for unique_resource, and did no=
t implement it by simply forwarding to unique_ptr (as a member, not as an a=
lias as I would, but still). Either way, you are still completely dependent=
on your implementer to solve this problem. Not to mention the nicheness of=
kernel mode and such things.</div><div><br></div></blockquote><div>Only if=
the proposal is worded to allow for that. And, the proposal as I wri=
te it for unique_resource, <i>will</i> point out that the idea is to use st=
atic values to minimize the size of generated code. Also, I wasn't cl=
ear on this, but the minimized code size isn't a requirement for kernel pro=
gramming. That is just as applicable to user mode code in downloaded =
/ on-demand products.<br><br>The main requirement for kernel code is not th=
rowing exceptions. Also most driver writers will not touch C++ in par=
t because its too much to untangle most C++ code and template based code fo=
r them to see what happens under the covers, and to minimize dependencies t=
hat might throw exceptions, or allocate memory from the wrong pool, etc.&nb=
sp; Currently (and I hope it stays that way) unique_resource, make_scoped_f=
unction, and make_scoped_resource are satisfactory for kernel code -- which=
for me means I'll never have to deal with another goto ErrorExit in my ker=
nel code.<br> <br></div><blockquote class=3D"gmail_quote" style=3D"mar=
gin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><=
div></div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8=
ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-sty=
le:solid;padding-left:1ex">And why do we want them to be uniform with point=
ers?</blockquote><div><br></div><div>Well, firstly, since they are pointers=
, then it's just cleaner to treat them like pointers, and secondly, we can =
save ourselves a whole bunch of hassle by treating them uniformly. Say, not=
having to re-invent unique_ptr.</div><div><br></div><blockquote class=3D"g=
mail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left-width:1px;border-=
left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Nobod=
y is going to create a template function that takes a `unique_ptr<T, D&g=
t;` which works correctly with both handles and pointers. </blockquote=
><div><br></div><div>Really? Because I'm pretty sure that anybody who took =
a `unique_ptr<T, D>` who used it in a fashion compatible with a point=
er to incomplete type, will also have made it completely compatible with ha=
ndles. For example... std::hash, and it's friends like greater and equal_to=
.. Another example is a "dereferencing" functor, similar to std::greater. Th=
ese are pretty common, but you can't go back and order up an extra speciali=
zation for them for unique_resource. But I can specify compatibility with t=
hem.</div><div><br></div><blockquote class=3D"gmail_quote" style=3D"margin:=
0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);=
border-left-style:solid;padding-left:1ex">`unique_ptr` has interfaces dedic=
ated to accessing that langauge-level support. It's <i>very</i> r=
elevant, because those interfaces no longer work.</blockquote><div><br></di=
v><div>That's immaterial, because there are plenty of ways of using unique_=
ptr that don't require them in the first place- and plenty of use cases for=
unique ptr (see incomplete types, for example) where they also could not b=
e supported. There's no loss here, much as there's no loss storing unique_p=
tr in std::vector, even though std::vector has a copy constructor.</div><di=
v><br></div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0=
..8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-s=
tyle:solid;padding-left:1ex">Ignoring the fact that resize() works on non-c=
opyable `T`s</blockquote><div><br></div><div>Yes, somewhat embarassing. Was=
n't it specced in C++03 to copy the last element or copy a default-construc=
ted T or something? Oh well. Copy constructor is enough. </div><div><b=
r></div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex=
;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style=
:solid;padding-left:1ex"> In short, `vector` is simply forwarding thos=
e restrictions to you.</blockquote><div><br></div><div>And I am forwarding =
the restrictions of handles to you. If you have a POSIX file-descriptor, or=
void*, then -> isn't gonna work, just as before.</div><div><br></div><b=
lockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-le=
ft-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;pad=
ding-left:1ex">Sounds like it is for managing the lifetime of a <i>poi=
nter</i> to me.</blockquote><div><br></div><div>Of course, since handl=
es are pointers, then I'm glad we agree that handles are perfectly valid an=
d intended. On the other hand, while this is fun, I refer back to my origin=
al statement on this topic, namely,</div><div> </div><blockquote class=
=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left-width:1px;bo=
rder-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">=
Firstly, screw what it's meant for. It is perfectly capable of serving this=
purpose in every way. Templates were never meant to be Turing-Complete, an=
d we were never meant to use expression templates, and Alexander Fleming ne=
ver meant to discover antibiotics. But that never stopped them from happeni=
ng, and being good or bad things irrelevant of whether or not they were mea=
nt to happen.<br>And secondly, the authors of unique_ptr <i>meant</i>&=
nbsp;for it to be customizable with the pointer typedef. If it was only mea=
nt for use with raw pointers... why offer the typedef?</blockquote><div><br=
></div><div>We can bitch all day about what unique_ptr was meant for, but i=
t's ultimately irrelevant.</div><div><br></div><blockquote class=3D"gmail_q=
uote" style=3D"margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-c=
olor:rgb(204,204,204);border-left-style:solid;padding-left:1ex">I mean, you=
could re-implement shared_ptr in terms of unique_ptr, if you expanded uniq=
ue_ptr's interface.</blockquote><div><br></div><div>Is <i>exactly</i> =
what I would have done. All you would need is a flag in the deleter telling=
the unique_ptr that it is safe for copying- if even that, in the presence =
of type traits. Not having this functionality is also supremely irritating.=
If shared_ptr were implemented this way, we could do something like std::u=
nique_ptr<T, std::function<void(T*)>> to take a pointer to any =
object, regardless of it's ownership schemes, which would be nice.</div><di=
v><br></div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0=
..8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-s=
tyle:solid;padding-left:1ex">No abstraction is perfect, true. But my point =
is that <i>you don't need an abstraction here</i>.</blockquote><div><b=
r></div><div>I think you misunderstand me. I don't think that there is anyt=
hing wrong whatsoever with </div><div><br></div><div style=3D"backgrou=
nd-color:rgb(250,250,250);border:1px solid rgb(187,187,187);word-wrap:break=
-word"><code><div><span style=3D"color:#008">auto</span><span style=3D"colo=
r:#000"> handle </span><span style=3D"color:#660">=3D</span><span style=3D"=
color:#000"> p</span><span style=3D"color:#660">.</span><span style=3D"colo=
r:#008">get</span><span style=3D"color:#660">();</span><span style=3D"color=
:#000"><br>stat</span><span style=3D"color:#660">(*</span><span style=3D"co=
lor:#000">handle</span><span style=3D"color:#660">,</span><span style=3D"co=
lor:#000"> </span><span style=3D"color:#660">...);</span></div></code></div=
><div><br></div><div></div></blockquote><div>I have to disagree with that.&=
nbsp; The second I see *handle I start worrying about if(handle =3D=3D null=
ptr). I shouldn't have to worry about that for a non-pointer type.<br=
><br></div><blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left=
: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div>The only irrel=
evance I was referring to was the name of the type. This interface fits in =
just fine with the abstraction I intended.</div><div><br></div><div><blockq=
uote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left-wi=
dth:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-=
left:1ex"> Oh sure, the `get` method will return a wrapper instead of =
a `T&`.</blockquote><div><br></div><div>IYAM, a pointer-alike type woul=
d actually be better than T&. Then, get() would have a much more unifor=
m interface, rather than "Hey guise, T* on shared_ptr and unique_ptr and au=
to_ptr but nyahahahaha fuck you T& on optional!". But regardless, you c=
ouldn't really deal with optional<T> in terms of unique_ptr, even dis=
regarding the copyability issue, I think. I never really considered it, but=
it might actually be possible. You'd end up with the constructor requiring=
too many implicit conversions, I think. Thanks for this suggestion.</div><=
/div></blockquote><div><br>DeadMG: I know the argument is a big heate=
d, but would you mind please keeping your language under control? Usi=
ng profanity doesn't strengthen your argument -- it just makes you look wea=
k. I'll say no more on this and I don't expect a response, but I assu=
re you that your comments carry far more weight in my mind when your langua=
ge doesn't paint you as an adolescent. Thanks.<br><br>-Andrew S=
andoval<br></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.<br />
To post to this group, send email to std-proposals@isocpp.org.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/?hl=3Den">http://groups.google.com/a/isocpp.org/group/std-pro=
posals/?hl=3Den</a>.<br />
<br />
<br />
------=_Part_898_278877.1361238355728--
.
Author: Andrew Sandoval <sandoval@netwaysglobal.com>
Date: Mon, 18 Feb 2013 17:47:11 -0800 (PST)
Raw View
------=_Part_1330_19056268.1361238432023
Content-Type: text/plain; charset=ISO-8859-1
On Monday, February 18, 2013 7:41:51 PM UTC-6, francisco.m...@oblita.com
wrote:
>
> Em segunda-feira, 18 de fevereiro de 2013 22h34min06s UTC-3,
> francisco.m...@oblita.com escreveu:
>
>> I guess you misunderstood me, I'm not being Windows specific, it's was
>> just to illustrate handle semantics. Building an interface towards specific
>> invalid handle values seems not to cover well handle semantics, were a
>> handle type may achieve a range of invalid values.
>>
>
> s/were/where/
>
Ok, thanks.
-Andrew Sandoval
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en.
------=_Part_1330_19056268.1361238432023
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
On Monday, February 18, 2013 7:41:51 PM UTC-6, francisco.m...@oblita.com wr=
ote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex=
;border-left: 1px #ccc solid;padding-left: 1ex;">Em segunda-feira, 18 de fe=
vereiro de 2013 22h34min06s UTC-3, <a>francisco.m...@oblita.com</a> escrev=
eu:<br><blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8e=
x;border-left:1px #ccc solid;padding-left:1ex">I guess you misunderstood me=
, I'm not being Windows specific, it's was just to illustrate handle semant=
ics. Building an interface towards specific invalid handle values seems not=
to cover well handle semantics, were a handle type may achieve a range of =
invalid values.<br></blockquote><div><br></div><div>s/were/where/</div></bl=
ockquote><div><br>Ok, thanks.<br>-Andrew Sandoval <br></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.<br />
To post to this group, send email to std-proposals@isocpp.org.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/?hl=3Den">http://groups.google.com/a/isocpp.org/group/std-pro=
posals/?hl=3Den</a>.<br />
<br />
<br />
------=_Part_1330_19056268.1361238432023--
.
Author: francisco.mailing.lists@oblita.com
Date: Mon, 18 Feb 2013 18:18:17 -0800 (PST)
Raw View
------=_Part_1605_16941344.1361240297185
Content-Type: text/plain; charset=ISO-8859-1
Em segunda-feira, 18 de fevereiro de 2013 22h45min55s UTC-3, Andrew
Sandoval escreveu:
> On Monday, February 18, 2013 7:28:57 PM UTC-6, DeadMG wrote:
>>
>> I think you misunderstand me. I don't think that there is anything wrong
>> whatsoever with
>>
>
>> auto handle = p.get();
>> stat(*handle, ...);
>>
>> I have to disagree with that. [...]
>
I also disagree... and, by this single statement, a discussion can go on
till the end of times, if none of the parts is willing to bend, or just
give up on bending. It's forced dereference on something that never needs
it. Pointers come from memory addresses, for data and executable code,
hence, iteration and control transfer is natural. Generalization of
characteristics brought iterators.
Now, nothing of this has to do with handles, handle wrappers provide handle
impersonation which has nothing to do with pointers (I've seen this in the
three completely unrelated handle wrappers I've checked).
Handles have nothing to do with positioning in memory, with iteration, with
control transfer. Hence *handle makes no sense for me, and a discussion
with someone that sees a point in that, and won't change his mind (as I
won't change mine either), has no point.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en.
------=_Part_1605_16941344.1361240297185
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
<br>Em segunda-feira, 18 de fevereiro de 2013 22h45min55s UTC-3, Andrew San=
doval escreveu:<br><blockquote class=3D"gmail_quote" style=3D"margin: 0;ma=
rgin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;">On Monday,=
February 18, 2013 7:28:57 PM UTC-6, DeadMG wrote:<blockquote class=3D"gmai=
l_quote" style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;pad=
ding-left:1ex">I think you misunderstand me. I don't think that there is an=
ything wrong whatsoever with <br></blockquote><blockquote class=3D"gma=
il_quote" style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;pa=
dding-left:1ex"><div><br></div><div style=3D"background-color:rgb(250,250,2=
50);border:1px solid rgb(187,187,187);word-wrap:break-word"><code><div><spa=
n style=3D"color:#008">auto</span><span style=3D"color:#000"> handle </span=
><span style=3D"color:#660">=3D</span><span style=3D"color:#000"> p</span><=
span style=3D"color:#660">.</span><span style=3D"color:#008">get</span><spa=
n style=3D"color:#660">();</span><span style=3D"color:#000"><br>stat</span>=
<span style=3D"color:#660">(*</span><span style=3D"color:#000">handle</span=
><span style=3D"color:#660">,</span><span style=3D"color:#000"> </span><spa=
n style=3D"color:#660">...);</span></div></code></div><div><br></div><div><=
/div></blockquote><div>I have to disagree with that. [...]</div></blo=
ckquote><div><br></div><div>I also disagree... and, by this single statemen=
t, a discussion can go on till the end of times, if none of the parts is wi=
lling to bend, or just give up on bending. It's forced dereference on somet=
hing that never needs it. Pointers come from memory addresses, for data and=
executable code, hence, iteration and control transfer is natural. General=
ization of characteristics brought iterators.</div><div><br></div><div>Now,=
nothing of this has to do with handles, handle wrappers provide handle imp=
ersonation which has nothing to do with pointers (I've seen this in the thr=
ee completely unrelated handle wrappers I've checked).</div><div><br></div>=
<div>Handles have nothing to do with positioning in memory, with iteration,=
with control transfer. Hence <span style=3D"font-family: monospace; b=
ackground-color: rgb(250, 250, 250); color: rgb(102, 102, 0);">*</span><spa=
n style=3D"font-family: monospace; background-color: rgb(250, 250, 250); co=
lor: rgb(0, 0, 0);">handle</span> makes no sense for me, and a discuss=
ion with someone that sees a point in that, and won't change his mind (as I=
won't change mine either), has no point.</div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.<br />
To post to this group, send email to std-proposals@isocpp.org.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/?hl=3Den">http://groups.google.com/a/isocpp.org/group/std-pro=
posals/?hl=3Den</a>.<br />
<br />
<br />
------=_Part_1605_16941344.1361240297185--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Mon, 18 Feb 2013 20:39:51 -0800 (PST)
Raw View
------=_Part_1313_2433453.1361248791487
Content-Type: text/plain; charset=ISO-8859-1
On Monday, February 18, 2013 5:28:57 PM UTC-8, DeadMG wrote:
>
> I mean, you could re-implement shared_ptr in terms of unique_ptr, if you
>> expanded unique_ptr's interface.
>
>
> Is *exactly* what I would have done.
>
You have now provided a shining example of Poe's Law<http://en.wikipedia.org/wiki/Poe%27s_law>for programmers. Your reasoning is quite literally operating on the level
*of sarcasm and parody*.
On the plus side, this makes your handle == pointer precept much more
reasonable by comparison.
I can understand people who don't want uniform initialization; I get their
reasoning. I can understand people who want to see named parameters in C++.
I can understand the thinking that leads to this "rich pointers"<http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3410.pdf>proposal. I can understand the idea that C++'s ranges should be primitive
types, without enforced iterator support. I can even understand the logic
behind wanting polymorphic lambdas to include that ridiculous `auto`
instead of not having a typename. In short, I can understand the reasoning
behind a lot of ideas I fervently disagree with.
But if you truly believe that it makes rational sense to implement
shared_ptr in terms of unique_ptr, to *mandate* this implementation in the
standard itself... I simply cannot conceptualize reasoning this alien to
me; the idea that this would be beneficial to anyone in any way, shape, or
form; objectively or even subjectively. So I'm afraid I cannot continue to
have a dialog with you on this subject.
Good day, sir!
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en.
------=_Part_1313_2433453.1361248791487
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
On Monday, February 18, 2013 5:28:57 PM UTC-8, DeadMG wrote:<blockquote cla=
ss=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #=
ccc solid;padding-left: 1ex;"><blockquote class=3D"gmail_quote" style=3D"ma=
rgin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,=
204);border-left-style:solid;padding-left:1ex">I mean, you could re-impleme=
nt shared_ptr in terms of unique_ptr, if you expanded unique_ptr's interfac=
e.</blockquote><div><br></div><div>Is <i>exactly</i> what I would have=
done.</div></blockquote><div><br>You have now provided a shining example o=
f <a href=3D"http://en.wikipedia.org/wiki/Poe%27s_law">Poe's Law</a> for pr=
ogrammers. Your reasoning is quite literally operating on the level <i>of s=
arcasm and parody</i>.<br><br>On the plus side, this makes your handle =3D=
=3D pointer precept much more reasonable by comparison.<br><br>I can unders=
tand people who don't want uniform initialization; I get their reasoning. I=
can understand people who want to see named parameters in C++. I can under=
stand the thinking that leads to this <a href=3D"http://www.open-std.org/jt=
c1/sc22/wg21/docs/papers/2012/n3410.pdf">"rich pointers"</a> proposal. I ca=
n understand the idea that C++'s ranges should be primitive types, without =
enforced iterator support. I can even understand the logic behind wanting p=
olymorphic lambdas to include that ridiculous `auto` instead of not having =
a typename. In short, I can understand the reasoning behind a lot of ideas =
I fervently disagree with.<br><br>But if you truly believe that it makes ra=
tional sense to implement shared_ptr in terms of unique_ptr, to <i>mandate<=
/i> this implementation in the standard itself... I simply cannot conceptua=
lize reasoning this alien to me; the idea that this would be beneficial to =
anyone in any way, shape, or form; objectively or even subjectively. So I'm=
afraid I cannot continue to have a dialog with you on this subject.<br><br=
>Good day, sir!</div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.<br />
To post to this group, send email to std-proposals@isocpp.org.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/?hl=3Den">http://groups.google.com/a/isocpp.org/group/std-pro=
posals/?hl=3Den</a>.<br />
<br />
<br />
------=_Part_1313_2433453.1361248791487--
.
Author: francisco.mailing.lists@oblita.com
Date: Wed, 20 Feb 2013 13:56:50 -0800 (PST)
Raw View
------=_Part_545_23267156.1361397410631
Content-Type: text/plain; charset=ISO-8859-1
I was toying around with this: http://ideone.com/YWIbca. I guess there may
be something related with current discussion (how smart *pointers* fell
natural for *pointers* and awkward for the rest), it's broken, no safety,
just a toy example for "type disguising" and decoration, I guess.
I could have more fun if "overload dot" was already solved =)
http://www.stroustrup.com/bs_faq2.html#overload-dot.
Regards.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/?hl=en.
------=_Part_545_23267156.1361397410631
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
I was toying around with this: <a href=3D"http://ideone.com/YWIbca">ht=
tp://ideone.com/YWIbca</a>. I guess there may be something related with cur=
rent discussion (how smart <i>pointers</i> fell natural for <i>pointer=
s</i> and awkward for the rest), it's broken, no safety, just a toy example=
for "type disguising" and decoration, I guess.<div><br></div><div>I could =
have more fun if "overload dot" was already solved =3D)</div><div><a href=
=3D"http://www.stroustrup.com/bs_faq2.html#overload-dot">http://www.stroust=
rup.com/bs_faq2.html#overload-dot</a>.</div><div><br></div><div>Regards.</d=
iv>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.<br />
To post to this group, send email to std-proposals@isocpp.org.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/?hl=3Den">http://groups.google.com/a/isocpp.org/group/std-pro=
posals/?hl=3Den</a>.<br />
<br />
<br />
------=_Part_545_23267156.1361397410631--
.