Topic: Static Iteration proposal (modelled after
Author: Clayton Davis <claytongdavis@gmail.com>
Date: Thu, 15 Nov 2012 02:53:43 -0500
Raw View
--e89a8ff1ca52c5732704ce83f575
Content-Type: text/plain; charset=ISO-8859-1
Hi Nicol,
Short summary: You're absolutely right, and I've downgraded "Static
Loops" to purely a proposal on "static for". The updated version is
attached.
Regarding static while and do...while -- I sat down to try to work
through an example, and then realized I couldn't come up with one.
Since identifiers with scope outside of the statement must be
constexpr, and identifiers declared in the condition are destroyed
after every iteration, there's no mechanism for the condition to ever
change value -- you get infinite compile-time iteration. In other
words, as far as I can tell, both reduce to the useless statement:
static if(condition) { /* ill-formed program */ }
So, you're absolutely right; I've removed them from the proposal, and
renamed it accordingly. Thanks!
Range-based for loops are a little trickier, as you say. Certainly
these seem reasonable, just intuitively:
static for (int i : {2, 3, 7})
const int array[3] = {2, 3, 7}; static for (int i : array)
const tuple<int, int, int> t = {2, 3, 7}; static for(int i : t)
But you're right; actually defining standards language for this is
difficult. I haven't convinced myself whether it's difficult in the
sense of "hard to state concisely or implement", or difficult in the
sense of "disruptive to existing code." Either way, I removed it from
the proposal too :)
I've also added the additional justification you provide; thanks for that!
Christof: That's definitely an interesting proposal. Less flexible,
in terms of what can be expressed there, but certainly more concise.
(In terms of which fits more smoothly into the language -- well, if we
assume static if is likely to become part of the language, then
probably we're on different but similar footing. If static if isn't
approved, then static for never had a chance anyway.) I'll admit the
one thing that makes me uncomfortable is: right now parameter packs
are basically free of semantics, just a comma-separated list in a
sense. What you're suggesting starts to look like a compile-time
constructor for a specific type of parameter pack. So, does it make
sense to "create" a parameter pack? Anyway, if we're heading in a
direction where we can manipulate parameter packs in more ways, then
I'd be more comfortable if they were genuine types with constructors
and access functions. So, just to go wild (not a
carefully-thought-out suggestion), imagine that parameter packs had a
genuine type, and that type could be manipulated:
template<typename F, typename ... Types>
void for_each(tuple<Types...> Tuple, F f)
{
const pack LoopPack = {0 .. sizeof...(Types)-1};
assert(typeid(LoopTuple) == typeid(Types));
f(get<LoopPack>(Tuple)) ...;
}
I'm leaving the .. for producing a range, but just trying to separate
out that feature from the question of how you can manipulate the range
like a parameter pack by making that conversion explicit. The
downside is that now two features are needed, but from my end I guess
I'd suggest you keep them separate somehow. Since we're just talking
out loud here :)
Thanks,
Clayton
On Sun, Nov 11, 2012 at 5:24 PM, Christof Meerwald <cmeerw@cmeerw.org> wrote:
> On Sun, 11 Nov 2012 12:31:01 -0800 (PST), ClaytonGDavis@gmail.com wrote:
>> I'd like to make a proposal that is complementary to N3329 (static if;
>> available at
>> http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3329.pdf), which
>> is currently under consideration. I believe there is a strong case to be
>> made that static iteration loops would fit nicely alongside static if. A
>> draft proposal is attached (Static Loops.pdf). In brief, though, the goal
>> is to provide an alternative to template recursion that more closely models
>> the runtime language, but forces loop unrolling during translation. For
>> example, the following function would do something like boost.fusion's
>> for_each:
>>
>> template<typename F, typename ... Types>
>> void for_each(tuple<Types...> Tuple, F f)
>> {
>> static for(size_t i = 0; i < sizeof...(Types); i++) {
>> f(get<i>(Tuple));
>> }
>> }
>
> Over on the Standard Discussion group under the "switch statements"
> thread I mentioned some alternative approach, see
> https://groups.google.com/a/isocpp.org/d/msg/std-discussion/q4KhZaN9IOY/wVukypfFJBEJ
> which would only require the addition of pack literals or constant
> integral pack expressions (or whatever these would be called).
> for_each could then be implemented as:
>
> template<typename F, typename ... Types>
> void for_each(tuple<Types...> Tuple, F f)
> {
> f(get<0 .. sizeof...(Types) - 1>(Tuple)) ...;
> }
>
> or using slightly different syntax as:
>
> template<typename F, typename ... Types>
> void for_each(tuple<Types...> Tuple, F f)
> {
> f(get<0 : sizeof...(Types)>(Tuple)) ...;
> }
>
> Well, you would also need to allow a pack expansion in an
> expression-statement (for this example), but the main idea would be to
> just add suitable syntax to write a range of integers as a pack (which
> can then be expanded as usual). I believe this would be much easier to
> implement than static for and might fit in more naturally into the
> existing variadic template support and can be used in contexts where
> "static for" can't be used (initializer lists) - and I am sure it will
> please those who argue for brevity in C++'s syntax...
>
> BTW, I am just thinking out loud here...
>
>
> Christof
>
> --
>
> http://cmeerw.org sip:cmeerw at cmeerw.org
> mailto:cmeerw at cmeerw.org xmpp:cmeerw at cmeerw.org
>
> --
>
>
>
--
--e89a8ff1ca52c5732704ce83f575
Content-Type: application/pdf; name="Static For.pdf"
Content-Disposition: attachment; filename="Static For.pdf"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_h9jky8gv0
JVBERi0xLjQKJdDUxdgKMSAwIG9iago8PCAvUyAvR29UbyAvRCAoc2VjdGlvbi4xKSA+PgplbmRv
YmoKNCAwIG9iagooTW90aXZhdGlvbikKZW5kb2JqCjUgMCBvYmoKPDwgL1MgL0dvVG8gL0QgKHNl
Y3Rpb24uMikgPj4KZW5kb2JqCjggMCBvYmoKKFRoZSBQcm9wb3NhbCkKZW5kb2JqCjkgMCBvYmoK
PDwgL1MgL0dvVG8gL0QgWzEwIDAgUiAgL0ZpdCBdID4+CmVuZG9iagoxMyAwIG9iaiA8PAovTGVu
Z3RoIDE0NTUgICAgICAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjafVdLc9s2EL7r
V/BWaCZiCBB85dI2SZOmM81MJ74lOcAkJKEhCZkELfvfdx+QJbtqLwKxwGI/7OPD6u3N6vUHWSYq
S8tSFcnNNlGlTrO6ScqsSBtVJzdd8lV8CSa4dr3JMyU+rKta+Gn9/eYP0K0SqdNclwp1NyotszLZ
5EWqG8Wq73qzVpV4DH4EfVWK9zS/dzOfoLJnJ2iZqkInG1mlTX4+AtU/vjeg9ctuMK5PWz9cQyAl
fFYApE5rHdU/ezKIP3ZYq1rcrjf4PSGeSsjiFQNTmVT89S0rsnsFv/JsQ6ZNUTBGmeWpLHMAq0FY
spVPoFpKcUQDfuk7nvbuB9nFWSaC5/Ew+QNggI1zXIHrHFxvN8ENUbL1UzzCE1x/mBFn2YijC3ve
Y3jH/DiikWAeong0vd/5hTxMriyKBkadah3RIhJdliLsLX+YfrKme9xEaBVC63CpEnMMPm5zWx7R
Q5/zXDXopHS9qYtC3OwhprR6cYjpWTTvzWRnPnAwI3rpkWd+SzCzFwARWJ7D5Qx5JFdi8MHdr8EQ
wPHjzEIzdryv9WNrJxZLYeJy2JvAEj9a9F+eCze2/dK5cccL0ZI6o7ZToJQ9rcMRVxA+D5mGA54i
RWdrMIVuOqcA7vm3FgDvHN6IXAUC9LcdLMd0piykw8i7eGUO1TVMJ6/P7rbHW2kplplvqjMx2XaZ
Znd/ykgQgaFDD+ZmiKGuKnGzrpXwrHk7edP1j7zx72UObhsn7DLYYjqGzmKIJI2GF3szbq6B3C1m
B/qqKcTWmrBMNCkpJ1FoWnRS7+Y9y49rKSiMOEEn0KboBBK+uDaux2vTufsosw8OLnESg5tf4CsY
X2emLlLCJ6aI1kTu6jyPo+eFyCQhMJmgrdPWELfcLT5YFm0nIC36otJ5Q8Z1mdYKCE9Vad5Euv1o
RzuZHnwP0UAoFQeAy51yG0ceIG13kxkGG/li3p/pZ/RRZ7Q2ipiDpOjst0zq0Z7O+k+qGO0RuUqL
7TK2HGycHfd2svdYx2gYJYaHZ/mMAvtwgNKfnzSxKH5+E/NaanxLSH7O+1qEa4FBRbd9bfvZsrYC
5JQQQHp4Q4txU5VGFqYUV0St4+w6AlnGaia5YcGl+1BMqoaLj3MlEjcZG65m9KF/qle0X4PfeTa5
e0duANll5SPMugIm4l1+jsRD/t10U6zRkTU7Ewx/zWFa2qsQsIxOpYGUyDWy8xM8FgO9HNk5NXCR
UoM+KDVUo58KEE7yU1w9yW6X/sdTOkIX4G/nFiv3ChRzAJ+aFm+wR0y5PmdLfHZ1wSRRQGnNC3qI
vtdI0+fkQZmbeeTwIks1mXjH7o3nzfZUKFfATPZucRNToIQ8n6CWLX8HyxhHd7cQTpANhsk6TmcH
RBS3u875IcqXsVuIGaUSHaB2UEtlu/RX05afKKh6ojX7wLwAV5BsByaHyUDoWyp52rqMJgTjRgOE
lsbalGmFzdUlUfxuiTyVQqZSSl6+vHHhyAl/3nJRDyA0LByRhylTQWYfgh1jvcIa0jqKmUeVemoI
cNHFxWdP/qv/bzzwgsCTHXlWnRsM4kgfmfTc9qSxUVQJHKgkdIfQhIGP8wZaxJyPBTKQUhXiT+oR
ypx7hGvdGyiqMlV1DM6v+Kjym6U1dxGTRcJGoX0wHH8dXzccKZV5N/RhTEA4eXrLaBNmERcbTuM7
wZO97Q/bBZwE7U9zEQ6GcSWHz8SbIzVyS0O+oSYSnopwSqTTJhvrj2dz6N68oad9gevQWw+2uF9D
LR5r6LAIZ2f7np4LEMUae+RZ23uqNpqwf1+C5avG4M0h3S6YST9FS1v+47D67WZ1t5KgC91/Ihvo
1psykRCYChKmHVZfv2dJB4twPGX7kbYOSZ4WUsFXn3xZ/bV6S39fnoVXZSrVWU1nYfIRppM3uJKa
Jq0aCflTpmVTnvInovoHnkWCcAplbmRzdHJlYW0KZW5kb2JqCjEwIDAgb2JqIDw8Ci9UeXBlIC9Q
YWdlCi9Db250ZW50cyAxMyAwIFIKL1Jlc291cmNlcyAxMiAwIFIKL01lZGlhQm94IFswIDAgNjEy
IDc5Ml0KL1BhcmVudCAyMCAwIFIKL0Fubm90cyBbIDExIDAgUiBdCj4+IGVuZG9iagoxMSAwIG9i
aiA8PAovVHlwZSAvQW5ub3QKL0JvcmRlclswIDAgMV0vSC9JL0NbMCAxIDFdCi9SZWN0IFsyNDAu
NDU0IDQ2MC4yNzUgMzI5Ljc0NSA0NzQuMjIyXQovU3VidHlwZS9MaW5rL0E8PC9UeXBlL0FjdGlv
bi9TL1VSSS9VUkkoaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9w
YXBlcnMvMjAxMi9uMzMyOS5wZGYpPj4KPj4gZW5kb2JqCjE0IDAgb2JqIDw8Ci9EIFsxMCAwIFIg
L1hZWiAxMDkuODU0IDcwNC4wNjMgbnVsbF0KPj4gZW5kb2JqCjE1IDAgb2JqIDw8Ci9EIFsxMCAw
IFIgL1hZWiAxMTAuODU0IDY2Ni4yMDIgbnVsbF0KPj4gZW5kb2JqCjIgMCBvYmogPDwKL0QgWzEw
IDAgUiAvWFlaIDExMC44NTQgMjAxLjMyOSBudWxsXQo+PiBlbmRvYmoKMTIgMCBvYmogPDwKL0Zv
bnQgPDwgL0YxNiAxNiAwIFIgL0YxNyAxNyAwIFIgL0YyMCAxOCAwIFIgL0YyMiAxOSAwIFIgPj4K
L1Byb2NTZXQgWyAvUERGIC9UZXh0IF0KPj4gZW5kb2JqCjIzIDAgb2JqIDw8Ci9MZW5ndGggMjA3
NCAgICAgIAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNrtWcty48YV3esruARrhp1+
PzJJFk7FlfEmlYp2thcQCQ5RJgGGAEcef73P7QZAgYJIJVImrrI2/e7b3fd5LvDN7c0fvpVyJgQL
xsjZ7RpNwRTXM2s0k9rNblez77N2vlA+K1C6bBfb+1hu40ge2/2aH2+/A039kCZI2RBmPBH7U7dk
dGxgEgPdinK+CC6rYtmm1cI9XC0d865f/REHC529nyIrOePC9CvbueDZFyr2cyFwV7QqKnIqdmls
4jirmFA9kW/nCyHVE8cJJox+8XGWCTtQYfOFBJNjZanyTme384Uh2lRCFDqQcNBuJtkfmNIDvb9M
HblQ4JS0YrYQmmlt01LQFCANQQhDt469u9Tbpl58wM3fbm/+fSNwAp+JmTCWGT+zms+Wu5vvf+Sz
Fca/m3Gmgp/dx1W7mWJGkMC3s3/d/PPmG1LE8ZWEFRByAPMD81wMmkGnrqeeKSRTwp9p2ZgmtEwN
2vADN5xk6aFBU+QcuCYvck1Y5pTtlxAxHoismKSnYVfuMj3ONB/o/THRQyW5IvMKhiQeNEkc7ch6
CExCvDaMJUd8smQ8qKLhUu+Qqvx8TjreMUMKGcdx7DFV+1SRtPkT1u09NMdd5LtnzgySId31UXej
GzHxDigbnOGjouNJqfKophSaNMNcZqVnWogHR1pJT0K5jyUeZFV8vJew5YUTgSzbcQvlWkjtH8rR
jEwFXGPO+zHD15OXMHChjxaCuuuVD2L8BGFKukkQvbMbv1bBVKT5T/Xah0Gtzdi/o+lOazmfJmj0
4LAFKcbTek0+L1wUBhTU2PH1giKhOEVCcVEoaG9jSUIxOp0HjZBDS2Ufksp7zZx0jzUenoG0V/ve
cx1SlafB9oHLOn+FdvBH/tWYLJmx6hqTYe7CmAdcdsNbNQWYhdXyFG4WnuuLthOS7Wh+qiYeGsgw
5DU35Jwbv1Ry+Qwr8p58M8Kx7x+CWPVh0org01iwshOiSWd9mgqqC8Rwp7DDMx/kGyB5AyT/HSAx
EpSUehVQQrSk0l8flFhmdbgSa/lJVn+GgSJ8X4EmisMc7HVoYq5BExOhiR6gibJgr3yDJr8FaHKW
5kF/hRt738ODF7exPMaSxsn7TbxFK6ZOyjvt6Q1CqzlTgt+Qo3csnGD+JQ8pyEPy13DI6lUcsnme
Q9bRUgy/6pDVmdaeCUc6CWM6yzM+g6bIapSSDBvt1dR94QdEGKxsTf5S0i6hBbTrscO2jmlpZ1pC
vcQLPTaubZWItARoneKITAFEZMvU25Bx6cHdqORu/JS7eQJEOvhRJX8/7kYiKgT1vERI8TOs91LA
jtCi/RUIZ8QQCYmnyGLoVCmzX1KvSFWdBtdPeDh9irjRxkSqeN9LGqP4UylNzO4oUCZMDFQz7Ru8
QIzV/xtseD178A+zBxWm9c1p8FT8/7MHwEdgOTMZVM6AJEf2TDoaIpyMC/9eHHAq8Ey2rqfcD6KG
AGhTFk+BBr3I/SD6IRMkUkZ0ml/ky7l05G/oCvl+vy2LputQBcM7Vsu2rKs02NapHu8rtsWuqGig
TQP1Om1uN93j2uN+W0CaFhr4sU2T93O4kvrwU5O6ZZWQGqzJOTtmZ9Pm1So/rLDS6uyv796JucjE
e4ooBLpFdmzTVNnXTaqromw3mC8Oqb+sq2XZFN1kHUdVdijyVX4XL+i7DyL/WPcbjod+fbspY8gC
k8epQNN0ry/z7RY6rQKPN6D6fpO3qXVHGJIMnMqmZetjE/lKc5tyVTTvEyPujt2Gci6yvrndHpv2
kLdFR7auitQofs534G03uk418X3iohu65PGw2kYq0mb7Q9EMgqOB+01RpdbhWC3ackeEMV22BQ5P
18Vk2e2v6jbN5yTLz3Ojs7zcRlb2npo+XhpzFqs/pu35rr9Gve/YUlafurlJNyoYD0NUg1a05XIy
yBsWTqltk4gXy/IHLjSpAh3QQjDvz18N+dXEjnsqilUaJH1YFS2cHeTQdAypeirz6LtprKLmz22X
cMAtGGvHgaYpoi0Rb0jYiiK6yKpDvSW6Wths2+nHPvZhhW0aX9a7fTy/SH0SDaPQCG8WjQxr62O7
j4aAdtnRa/vJJt8V3ZmDwWC+PK2fUJheKk15Fw+GkKMHQH1suoE8VU2Z1JDanbZ8jkxMQ8O7xlTg
cQ71yZdEcoKS6kim2sA7JvUks3pMeurKhxp33fWSJfNPwqk7CcMBbLf54Uvq9u6tU+j6kFYvtzmM
utfyolgVKzalkEhFzdihv2UJv+MsQUrDvLevkiUQLevdW5bwdbKER98kgjv74tfB9jZV+ahXpmpJ
4NbTNYBL6lgepp4IvnN59htCep34yCM1L2Jm4PnUZ0RAfRbobcGyEMyL9A2WyEzQkZYLZvBigeI8
WA3x0qc7OCz6dIfqA8FjhbkphTIx2F9yX8LCRMxXy4UkkPwFtZVKjhD+IkCbutu8myuTiqcUSgDc
iNNXvfX052MdWPBnKedJU+O/N/2Mf2+SKXPt35uS4vSjYMr8mA/uyg8y+pg8/rV0OZs05ukfZI8s
EM6NGz2RLMUhfv6L8tl5VARBKsaliDPKAdVibBOTLGpF4Cp4BH+p1ZS/FPWaMQKs/JZg7BciARVp
0lsebvsJKAJT91Xq9jQInAGZRbxMwAOuuKn7g7qTIwDyBIAmQMsyr+jaossRitQ5RmBIKJR6dBjV
3WGp08FALVziAI0VVbcD4P647XbRC+KGfhXhwY5wN5WwUtq4RNbzEGQJIG9FUEcGWK9Pt5a9Y/oV
dmoZKQplbmRzdHJlYW0KZW5kb2JqCjIyIDAgb2JqIDw8Ci9UeXBlIC9QYWdlCi9Db250ZW50cyAy
MyAwIFIKL1Jlc291cmNlcyAyMSAwIFIKL01lZGlhQm94IFswIDAgNjEyIDc5Ml0KL1BhcmVudCAy
MCAwIFIKPj4gZW5kb2JqCjI0IDAgb2JqIDw8Ci9EIFsyMiAwIFIgL1hZWiAxMTAuODUxIDcwNC4w
NjMgbnVsbF0KPj4gZW5kb2JqCjI1IDAgb2JqIDw8Ci9EIFsyMiAwIFIgL1hZWiAxMTAuODU0IDY2
Ni4yMDIgbnVsbF0KPj4gZW5kb2JqCjI2IDAgb2JqIDw8Ci9EIFsyMiAwIFIgL1hZWiAxMTAuODU0
IDY2OC42OTIgbnVsbF0KPj4gZW5kb2JqCjI4IDAgb2JqIDw8Ci9EIFsyMiAwIFIgL1hZWiAxMTAu
ODU0IDY1NC4yNDcgbnVsbF0KPj4gZW5kb2JqCjI5IDAgb2JqIDw8Ci9EIFsyMiAwIFIgL1hZWiAx
MTAuODU0IDYzOS44MDEgbnVsbF0KPj4gZW5kb2JqCjMwIDAgb2JqIDw8Ci9EIFsyMiAwIFIgL1hZ
WiAxMTAuODU0IDYyNS4zNTUgbnVsbF0KPj4gZW5kb2JqCjMyIDAgb2JqIDw8Ci9EIFsyMiAwIFIg
L1hZWiAxMTAuODU0IDYxMC45MDkgbnVsbF0KPj4gZW5kb2JqCjMzIDAgb2JqIDw8Ci9EIFsyMiAw
IFIgL1hZWiAxMTAuODU0IDU5Ni40NjMgbnVsbF0KPj4gZW5kb2JqCjM0IDAgb2JqIDw8Ci9EIFsy
MiAwIFIgL1hZWiAxMTAuODU0IDU4Mi4wMTcgbnVsbF0KPj4gZW5kb2JqCjM1IDAgb2JqIDw8Ci9E
IFsyMiAwIFIgL1hZWiAxMTAuODU0IDU2Ny41NzIgbnVsbF0KPj4gZW5kb2JqCjM2IDAgb2JqIDw8
Ci9EIFsyMiAwIFIgL1hZWiAxMTAuODU0IDU1My4xMjYgbnVsbF0KPj4gZW5kb2JqCjM3IDAgb2Jq
IDw8Ci9EIFsyMiAwIFIgL1hZWiAxMTAuODU0IDUzOC42OCBudWxsXQo+PiBlbmRvYmoKMzggMCBv
YmogPDwKL0QgWzIyIDAgUiAvWFlaIDExMC44NTQgNTI0LjIzNCBudWxsXQo+PiBlbmRvYmoKMzkg
MCBvYmogPDwKL0QgWzIyIDAgUiAvWFlaIDExMC44NTQgNTA5Ljc4OCBudWxsXQo+PiBlbmRvYmoK
NDAgMCBvYmogPDwKL0QgWzIyIDAgUiAvWFlaIDExMC44NTQgNDk1LjM0MiBudWxsXQo+PiBlbmRv
YmoKNDEgMCBvYmogPDwKL0QgWzIyIDAgUiAvWFlaIDExMC44NTQgNDgwLjg5NyBudWxsXQo+PiBl
bmRvYmoKNDIgMCBvYmogPDwKL0QgWzIyIDAgUiAvWFlaIDExMC44NTQgNDY2LjQ1MSBudWxsXQo+
PiBlbmRvYmoKNDMgMCBvYmogPDwKL0QgWzIyIDAgUiAvWFlaIDExMC44NTQgNDUyLjAwNSBudWxs
XQo+PiBlbmRvYmoKNDQgMCBvYmogPDwKL0QgWzIyIDAgUiAvWFlaIDExMC44NTQgNDM3LjU1OSBu
dWxsXQo+PiBlbmRvYmoKNDUgMCBvYmogPDwKL0QgWzIyIDAgUiAvWFlaIDExMC44NTQgNDIzLjEx
MyBudWxsXQo+PiBlbmRvYmoKNDYgMCBvYmogPDwKL0QgWzIyIDAgUiAvWFlaIDExMC44NTQgNDA4
LjY2NyBudWxsXQo+PiBlbmRvYmoKNDcgMCBvYmogPDwKL0QgWzIyIDAgUiAvWFlaIDExMC44NTQg
Mzk0LjIyMiBudWxsXQo+PiBlbmRvYmoKNDggMCBvYmogPDwKL0QgWzIyIDAgUiAvWFlaIDExMC44
NTQgMjUyLjI1NCBudWxsXQo+PiBlbmRvYmoKNDkgMCBvYmogPDwKL0QgWzIyIDAgUiAvWFlaIDEx
MC44NTQgMjU0LjU3OSBudWxsXQo+PiBlbmRvYmoKNTAgMCBvYmogPDwKL0QgWzIyIDAgUiAvWFla
IDExMC44NTQgMjQwLjEzMyBudWxsXQo+PiBlbmRvYmoKNTEgMCBvYmogPDwKL0QgWzIyIDAgUiAv
WFlaIDExMC44NTQgMjI1LjY4NyBudWxsXQo+PiBlbmRvYmoKNTIgMCBvYmogPDwKL0QgWzIyIDAg
UiAvWFlaIDExMC44NTQgMjExLjI0MSBudWxsXQo+PiBlbmRvYmoKNTMgMCBvYmogPDwKL0QgWzIy
IDAgUiAvWFlaIDExMC44NTQgMTk2Ljc5NSBudWxsXQo+PiBlbmRvYmoKNTQgMCBvYmogPDwKL0Qg
WzIyIDAgUiAvWFlaIDExMC44NTQgMTgyLjM1IG51bGxdCj4+IGVuZG9iago1NSAwIG9iaiA8PAov
RCBbMjIgMCBSIC9YWVogMTEwLjg1NCAxNjcuOTA0IG51bGxdCj4+IGVuZG9iagoyMSAwIG9iaiA8
PAovRm9udCA8PCAvRjIyIDE5IDAgUiAvRjI0IDI3IDAgUiAvRjE3IDE3IDAgUiAvRjI1IDMxIDAg
UiA+PgovUHJvY1NldCBbIC9QREYgL1RleHQgXQo+PiBlbmRvYmoKNjAgMCBvYmogPDwKL0xlbmd0
aCAyMjk4ICAgICAgCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42s1YTZPcthG976+Y
8olT0tIECJJgnKRKTqKyc1BVrPVJ1gE7w5lhhR8Tfmh3/ev9uhvkDkdcxanYVb4QQANsNB66gdf4
9u7m67cq2ygV5kmiN3cHVKPQJmaTJibUJtvc7TcfgqGoz5Ubiv719jbWaXA/DlTJguFUiGTXbm/R
3vtm2Ut/3XZe0hVu7+4r33LN3g/YahuMuy2qJ+nqT203FF24/Xj3z43KwiTJN7fKhMakYszdibTr
VAVlVY390JFhInBUREFfDqMbyrYR6cOpICuo2g+Q76Reicnt2f+8a8dqL9V77vH/jH1xGCvR/FAO
Jz967LqiIbsHtvR2zdS/vXqlFC0rCg6FG8au6L+hpg5OLf36QKsvPlG16BhbFXwv470JVem7Rerx
jgi3jHGzglsUHIEwcJPGWZY2eAtLV4lc9gVlI2VXVAIULSFaGj8AHxMraDmRWhNDbdd6zX2xl95p
XeH2NjM2eLu1Omg76SseHfymwMJMkgbvYmOMdPwUJdEPmPqxbI6iedc2tJOl2Nv7mVft4qHF47mD
FoCrc+WXW3R1Sb+S5L5zjXgVTaGC1yTO4bioDzIEKqpyVw7Vk7TJNwr/+3ByA/9ig6/el82uEHHt
vbz8KVJm9yJy7WERHTb4tE0MnBM+Nxa9iKYx0tWVFBs+aEo/pGl9lNHyLC0PGsphKPbSL5uYAZDO
z8PQuIa8YhAJ4VT0PQyV2MVfcJLbhdWJWO0jhsYwFHUxbwbrdo03yE7O2RSMA7yLMJw6bOCtGful
pfZ566R5GJvdMJuWB30rcuD2tIaro3UaHWMDesw5hRAs2YdfSc93F8JPHF0UV8bYOfRp1IE9VBuG
mgR14Xwsc5NdH2Xvkd+VhyeR4CxppOYar4I8quhedIbakWLCJ8roFOzbBnvt2/NBE0d29mJYVzNy
GMDIoc9JcwYwpMnz4E0vct/dlxRv8ocPPvH9WGn+t9wjlNdifTrHD+2EK4cmi/wuibM9nGjBzwc2
2VSfcR8goPqrS6Efa5GIs6eMGZddJ6j8iYz5+q3Wl1dQFMIlb1Ue4pz15uE3cSu6Mah+5m/FEsf1
aYwoNJcKcZWleY41s7I/r82ZA4tpAJxEqYSUU+Gk6KeCf17emSYKtZ313+EktAR6ThDgN4vzlgoV
/CwtNvLmH3c3/7lR+CvaqI1OszAy8SaJklBlerOrbz58jDZ7dGKzwji3mwceWm/iMFEatWrz/uZf
N99+foXrTIcZhiSRCfMsniHMVB68W8MHUGdQ4e3/69oSyW4YdnUSEybYXSpwXEmrl9YgrUJaj9I6
SwvBl5qEgEpwp77HxsXByF/2l+AN17v5q3mLYwoiFad8eyBUoojEOavLM/91/H1aXaWsYOkFy1Xi
CrfZZ/uY5uk6bhrjY/VF3FQapiqdhpAvaTbYF1ouQ+W1JwvIdYx9tOkS88PqLDq0Ub48zgldIEcH
HIFrCFt4RPAXOg4VdSvwEMFS2VjMQE0H36wFiA5Vqpem0E5rvk6pcItWKQU8xOIsQvjj8m35260C
H4WRnmHyG2zNrw+fGLoAnzFZGCMU/6/wibGtuWFdKp+jh6IZdqSJJQhTnDUEHAowOgv8yjUPyRIm
hV/yOSB6MeQdlBlSmUexgBgHr7ZwenwSv0dJki631WTUr1RKliXA+HM/s0nwga4BXkOc2uAjhCpa
32vEFrZb2eV2Q03Ch3DC0Y3vyF+SZ0GzejDaMNF6WtvCZnjTPPnS7VN4fXxFpI+rZ1IE7fHypngj
JPryzlL++iFWJ9QKUYEcQ2Se9fOwRmjMBf+nxp5ZTiNcBtfolkY+0xgNnuPvSoX7HXlBXwrz8OPB
VEBwVi5dz+zJSJzMklpQbSb5xM4feV5IcX3vS2ZL0r7i4jOrp0OemDYxBJyZP3rjIJ4YENXBMXy+
UQ5ev1ulL89QJHoBRaLmhaNHbEald3UhvZwSWnA1GUMEm+/8yo90It17GKp24j/SXZfHk6dkNOzE
hGHOhXh2sUMLnZusWFlDN/o0iEzTWLNnhr2kiN5D9Owh+sKDCEbcNO+J9dRl5TrpdmdKHpzfj0sV
c4pJSV/rh5d+nmcCvELAZzpMOCRzPpqBYza7aqTcmuQg9LfCuRhZ6qdjcqKPO072SFq7oSt3hVcn
tmRMaFg9hlEaKwngazkjKC9fS2gkBYz5Xqc99HP1IuP4QumqY9vBjWsvB1eciSKa5JaY0oi/cTLz
vMWkRuJP2ct8zs/aSvnsjWqZTaBZHl5gtk8T6SyEjXZF6ZnxlOIU/jWinPjp9GYxRbM/DIgfd4D1
vz5OWA5GcVh4Wj+Ux+lBAl2cnjg/rj/TS8JeGvc0/EnqTgqs8tnzu35Sk+GUl2yrnXJaDJ6eFbjB
MUmVyjXH0R2Llx8qplNQZUuI3Xi8hglDpt2QHMzSfNREyo3B+7b2vTv4Xn/5B0X5Iq1UHnIa4Z+Y
pHV2natXs9SC3zgMpUuOnevflD0aWMFvStThKE/FiTEP9MckRwnFMT9DUc9hpLcLqe9LbLeAy12t
/1uOBEPZ1ZNY7h6lhx9Pit4Pa9e9zw1/mBwnC3MzX8ZAKIKnKXorUsjdqNbQx1GzplqxdummKYjg
nCqFRGEzKVIqLM4dYp6km75Yg8mZNERT7nRldx7GyHuWHPqKjigL022yhPYTdCrilDj3S67v1+yN
TZhpO+n/O1yAiSj88w3XG67vuS6SM0vOXK/4+7TgyimT54TjNOGBMy3qiQrqFVSQQUB5poks4Xvk
L/ljlrzM/2G6vSZhhzWAFOV56g9PzlUOVpn9NuRc5ZDZ34GcXyGbhhaOFy0wLcUdfpZWIUUrwtX0
zMTYl3wRM0qKaGoJqnGk1/1Em3RK0DJJD+CW6+nBiifRm756ft9YtRHeFoeW6fSFF60bo/P1ZCKk
aIkQZB6PVL2cXxJ7V+lVTH8hrjRm40kTnhQtTGqJBcCsmKbD98xf+h8F5UKZ/h+XMNtGjzGLiwd6
EsNWJfw1dDigTocDTPQLRSZ2bZDmC91kiw1ci3fMhvNgJfFhUWTsr8iJgD92EYm6zuG5PkDiKSZ/
AazSVHAKZW5kc3RyZWFtCmVuZG9iago1OSAwIG9iaiA8PAovVHlwZSAvUGFnZQovQ29udGVudHMg
NjAgMCBSCi9SZXNvdXJjZXMgNTggMCBSCi9NZWRpYUJveCBbMCAwIDYxMiA3OTJdCi9QYXJlbnQg
MjAgMCBSCi9Bbm5vdHMgWyA1NiAwIFIgNTcgMCBSIF0KPj4gZW5kb2JqCjU2IDAgb2JqIDw8Ci9U
eXBlIC9Bbm5vdAovQm9yZGVyWzAgMCAxXS9IL0kvQ1swIDEgMV0KL1JlY3QgWzMzMy40MTcgNjA2
LjkyNCAzNjcuNTk3IDYyMC44NzJdCi9TdWJ0eXBlL0xpbmsvQTw8L1R5cGUvQWN0aW9uL1MvVVJJ
L1VSSShodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9KVEMxL1NDMjIvV0cyMS9kb2NzL3BhcGVycy8y
MDEyL24zNDQ0Lmh0bWwpPj4KPj4gZW5kb2JqCjU3IDAgb2JqIDw8Ci9UeXBlIC9Bbm5vdAovQm9y
ZGVyWzAgMCAxXS9IL0kvQ1swIDEgMV0KL1JlY3QgWzMxMC4zMzcgMjk0LjU5NSAzNzUuODAyIDMw
Ny4yMTVdCi9TdWJ0eXBlL0xpbmsvQTw8L1R5cGUvQWN0aW9uL1MvVVJJL1VSSShodHRwOi8vaXNv
Y3BwLm9yZy9mb3J1bXMvaXNvLWMtc3RhbmRhcmQtZGlzY3Vzc2lvbj9wbGFjZT10b3BpYyUyRnN0
ZC1kaXNjdXNzaW9uJTJGcEtqUkpKaGVkQUklMkZkaXNjdXNzaW9uKT4+Cj4+IGVuZG9iago2MSAw
IG9iaiA8PAovRCBbNTkgMCBSIC9YWVogMTA5Ljg1NCA3MDQuMDYzIG51bGxdCj4+IGVuZG9iago2
MiAwIG9iaiA8PAovRCBbNTkgMCBSIC9YWVogMTEwLjg1NCA1MTcuMDk0IG51bGxdCj4+IGVuZG9i
ago2MyAwIG9iaiA8PAovRCBbNTkgMCBSIC9YWVogMTEwLjg1NCA1MTkuNDE5IG51bGxdCj4+IGVu
ZG9iago2NCAwIG9iaiA8PAovRCBbNTkgMCBSIC9YWVogMTEwLjg1NCA1MDQuOTczIG51bGxdCj4+
IGVuZG9iago2NSAwIG9iaiA8PAovRCBbNTkgMCBSIC9YWVogMTEwLjg1NCA0OTAuNTI3IG51bGxd
Cj4+IGVuZG9iago2NiAwIG9iaiA8PAovRCBbNTkgMCBSIC9YWVogMTEwLjg1NCA0NzYuMDgxIG51
bGxdCj4+IGVuZG9iago2NyAwIG9iaiA8PAovRCBbNTkgMCBSIC9YWVogMTEwLjg1NCA0NjEuNjM2
IG51bGxdCj4+IGVuZG9iago2OCAwIG9iaiA8PAovRCBbNTkgMCBSIC9YWVogMTEwLjg1NCA0NDcu
MTkgbnVsbF0KPj4gZW5kb2JqCjY5IDAgb2JqIDw8Ci9EIFs1OSAwIFIgL1hZWiAxMTAuODU0IDQz
Mi43NDQgbnVsbF0KPj4gZW5kb2JqCjcwIDAgb2JqIDw8Ci9EIFs1OSAwIFIgL1hZWiAxMTAuODU0
IDI0OS43NjMgbnVsbF0KPj4gZW5kb2JqCjcxIDAgb2JqIDw8Ci9EIFs1OSAwIFIgL1hZWiAxMTAu
ODU0IDI0OS43NjMgbnVsbF0KPj4gZW5kb2JqCjcyIDAgb2JqIDw8Ci9EIFs1OSAwIFIgL1hZWiAx
MTAuODU0IDIzNS4zMTggbnVsbF0KPj4gZW5kb2JqCjczIDAgb2JqIDw8Ci9EIFs1OSAwIFIgL1hZ
WiAxMTAuODU0IDIyMC44NzIgbnVsbF0KPj4gZW5kb2JqCjc0IDAgb2JqIDw8Ci9EIFs1OSAwIFIg
L1hZWiAxMTAuODU0IDIwNi40MjYgbnVsbF0KPj4gZW5kb2JqCjc1IDAgb2JqIDw8Ci9EIFs1OSAw
IFIgL1hZWiAxMTAuODU0IDE5MS45OCBudWxsXQo+PiBlbmRvYmoKNzYgMCBvYmogPDwKL0QgWzU5
IDAgUiAvWFlaIDExMC44NTQgMTc3LjUzNCBudWxsXQo+PiBlbmRvYmoKNzcgMCBvYmogPDwKL0Qg
WzU5IDAgUiAvWFlaIDExMC44NTQgMTYzLjA4OCBudWxsXQo+PiBlbmRvYmoKNzggMCBvYmogPDwK
L0QgWzU5IDAgUiAvWFlaIDExMC44NTQgMTQ4LjY0MyBudWxsXQo+PiBlbmRvYmoKNzkgMCBvYmog
PDwKL0QgWzU5IDAgUiAvWFlaIDExMC44NTQgMTM0LjE5NyBudWxsXQo+PiBlbmRvYmoKNTggMCBv
YmogPDwKL0ZvbnQgPDwgL0YxNyAxNyAwIFIgL0YyMiAxOSAwIFIgL0YyNCAyNyAwIFIgL0YyNSAz
MSAwIFIgPj4KL1Byb2NTZXQgWyAvUERGIC9UZXh0IF0KPj4gZW5kb2JqCjgzIDAgb2JqIDw8Ci9M
ZW5ndGggMjU1MiAgICAgIAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNrlWUuT3LgN
vs+v6FNKXXHLIvUgZWdzcBLXelO1m5Tn5vVB7mb3qKxHW1LPjJM/nw8ApWn1aMrerTlsVS4CHyAJ
gAAIQG+ur16+VWalVJinqV5d79GMQpsmqyxNQp2Y1fVu9SH426nrXLPWJhiqr+tNrKJguHGdk2bZ
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
4AulGDyrnjGOc7VgkI0SZP5k0tdWSKY047NojyfJNbCqgvgU9hcolvweV+rukYD7tixG49AW5Gio
eXdTju6ZuhP1VC3cC7wpPC4T4Qt9YP/A5YFIKpFUw8gkX6eheqoSEA0iLo/NzC8W08YbbMa6DOXw
vgy27079QLVMSe7NVBd7XJrpzwtnZ06cBnHEvhtLMzsZI/JfLTmJCLm1nT9mT0RVORwkxSpGYhWA
YtYrBUCwOZwB9XLN66hmN0VDNuZ1NqfYxnIlwFIIvuHSEX1vedxxm6lXZPo2l1QK8r85i0M5fMqV
BGYpE5jhvF+Q5OfBPyk2DcKl4CkKTZL/ruTBSg+Ryf6JIkJuZ2kD0hwdqKWAXtkwMd8K6LNk2k7L
Xk/Fz7jD2P6m6HlhE3oy0gf6o3hxnyzUZsp7KFBDMMYgncSdXoSbmPvWtrOzF6ljBqbqwmFpE6gy
5aWKUkTk+fpCpw0E+IaqrxS1phxCQhMkSxfViiQIjzjKtHamyknytBJqRkECI3YhKglQySD5F2R2
UGUjpmOQPVGpII75PPi721mvkl4rveNsDvZiFOX0FDfG5IMyw7l97uNwtjWFPOgkoBNwlCzT90oB
HtPJHIV6Nn5uq/nulDv9npTb/IFSbhNGdjogvtjyOzPfNA2jLPk/NN2LzCqOsjBCe/YcXUvUqI2W
8Gc3/u5TpHw0XLdDiQAc0d7AiCqo/QL+SwOIkEZeznbcSmJvoBa7XenjbgxzhgNYyOT0+whD0++j
p3/2jO+1RKT6IXrzAW6uwhhh4ibJw1j5cDEZS3D/A7cwHZIKZW5kc3RyZWFtCmVuZG9iago4MiAw
IG9iaiA8PAovVHlwZSAvUGFnZQovQ29udGVudHMgODMgMCBSCi9SZXNvdXJjZXMgODEgMCBSCi9N
ZWRpYUJveCBbMCAwIDYxMiA3OTJdCi9QYXJlbnQgMjAgMCBSCi9Bbm5vdHMgWyA4MCAwIFIgXQo+
PiBlbmRvYmoKODAgMCBvYmogPDwKL1R5cGUgL0Fubm90Ci9Cb3JkZXJbMCAwIDFdL0gvSS9DWzAg
MSAxXQovUmVjdCBbNDExLjQzNiAyOTEuNjA2IDQ0NS42MTYgMzA1LjU1NF0KL1N1YnR5cGUvTGlu
ay9BPDwvVHlwZS9BY3Rpb24vUy9VUkkvVVJJKGh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEv
c2MyMi93ZzIxL2RvY3MvcGFwZXJzLzIwMTIvbjMzMjkucGRmKT4+Cj4+IGVuZG9iago4NCAwIG9i
aiA8PAovRCBbODIgMCBSIC9YWVogMTEwLjg1MSA3MDQuMDYzIG51bGxdCj4+IGVuZG9iago4NiAw
IG9iaiA8PAovRCBbODIgMCBSIC9YWVogMTEwLjg1NCA1MjkuNzE0IG51bGxdCj4+IGVuZG9iago4
NyAwIG9iaiA8PAovRCBbODIgMCBSIC9YWVogMTEwLjg1NCA1MzIuNzAyIG51bGxdCj4+IGVuZG9i
ago4OCAwIG9iaiA8PAovRCBbODIgMCBSIC9YWVogMTEwLjg1NCA1MTguMjU3IG51bGxdCj4+IGVu
ZG9iago4OSAwIG9iaiA8PAovRCBbODIgMCBSIC9YWVogMTEwLjg1NCA1MDMuODExIG51bGxdCj4+
IGVuZG9iago5MCAwIG9iaiA8PAovRCBbODIgMCBSIC9YWVogMTEwLjg1NCA0ODkuMzY1IG51bGxd
Cj4+IGVuZG9iago5MSAwIG9iaiA8PAovRCBbODIgMCBSIC9YWVogMTEwLjg1NCA0NzQuOTE5IG51
bGxdCj4+IGVuZG9iago5MiAwIG9iaiA8PAovRCBbODIgMCBSIC9YWVogMTEwLjg1NCA0NjAuNDcz
IG51bGxdCj4+IGVuZG9iago5MyAwIG9iaiA8PAovRCBbODIgMCBSIC9YWVogMTEwLjg1NCA0NDYu
MDI3IG51bGxdCj4+IGVuZG9iago5NCAwIG9iaiA8PAovRCBbODIgMCBSIC9YWVogMTEwLjg1NCA0
MzEuNTgyIG51bGxdCj4+IGVuZG9iago5NSAwIG9iaiA8PAovRCBbODIgMCBSIC9YWVogMTEwLjg1
NCA0MTcuMTM2IG51bGxdCj4+IGVuZG9iago5NiAwIG9iaiA8PAovRCBbODIgMCBSIC9YWVogMTEw
Ljg1NCAyNDMuOTUyIG51bGxdCj4+IGVuZG9iago5NyAwIG9iaiA8PAovRCBbODIgMCBSIC9YWVog
MTEwLjg1NCAyNDYuMjc2IG51bGxdCj4+IGVuZG9iago5OCAwIG9iaiA8PAovRCBbODIgMCBSIC9Y
WVogMTEwLjg1NCAyMzEuODMxIG51bGxdCj4+IGVuZG9iago5OSAwIG9iaiA8PAovRCBbODIgMCBS
IC9YWVogMTEwLjg1NCAyMTcuMzg1IG51bGxdCj4+IGVuZG9iagoxMDAgMCBvYmogPDwKL0QgWzgy
IDAgUiAvWFlaIDExMC44NTQgMjAyLjkzOSBudWxsXQo+PiBlbmRvYmoKMTAxIDAgb2JqIDw8Ci9E
IFs4MiAwIFIgL1hZWiAxMTAuODU0IDE4OC40OTMgbnVsbF0KPj4gZW5kb2JqCjgxIDAgb2JqIDw8
Ci9Gb250IDw8IC9GMTcgMTcgMCBSIC9GMzIgODUgMCBSIC9GMjIgMTkgMCBSIC9GMjQgMjcgMCBS
IC9GMjUgMzEgMCBSID4+Ci9Qcm9jU2V0IFsgL1BERiAvVGV4dCBdCj4+IGVuZG9iagoxMDUgMCBv
YmogPDwKL0xlbmd0aCAyMDg4ICAgICAgCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4
2u1ZSZPjRBO9z6/wUQ7GhWrTAicgPiLgAATRERyAQ40ttwWy5E8Lzfx7XlaWJMstQ88McOLSVZWq
JSuXl6/cnz+8+vhLpTYyFUpas3k4bqSMRYZuYo1QJt08HDY/Rmq7k1LZ6OFUbHc6tdF3bXNBT0ZN
56rtzw9ff/ylTLFW5NYq2ibe7FQiVGZ5gy8++khKLFBJ9Fj+tlVpVHQ87P2WEBybqmq2Koueyvpx
FLVn14d5DbeQ8UdM3qFpLt0nrADdY6lAJrJcsQJhWRL9FNuY5+vFfJULnSgsG6fvyrrsd13v+uJc
1NDCKBXttzaOmvpQ9mVTh2OzTSryNJbeekaKNM02OzS55r2aS7+moLQik2ZzNfHTNb1SkehsVKv4
/dKSBkXXrZ9vlZDWvt/xsIxc0yAXUk+Gme2x4nT4Q4oE+y1M/xUb/uJDBv5tuoIl7nAIrka/5hba
4maIKe/j7uJ9XOzLn2Jpinb1InmCgF0oWO7XtNNKxJCEeatBs1OkeJKHC8jnWy6s7Xd8T2f/F5D/
RkDqGIMk2eyMFhpqc0AeYfnYBOhBJziY+xykCLmtjELU4YONyo4nDF1x4F5Z3+xD09uu5wGBF/ea
4ySZzyOdCQf71yTLoyeCvoKPaov/4/ChbAu6FIyXCmsRlNIIYwKi9idCRpX61ME+b3lAWh/CziFp
uvClXrMlYF0YnfxJmK2YNcu9q8Ka12v7JiJJ5ThjJUiXG5pE5OpqQ3gAUNCupkUsUID+LP6WW9tE
aDPF69MJfoZtTmyTkyOrcz1iU2vktE2yYOskxNi+CUBE1Q8OHfquPIRS6L2bjlGATtkXrfM39cOF
s1nk2rB239T4XJMSPUvoQgV8CKfhD22C5lN8y3M4+jAe5bxfqMhd6+kqwk2rovJ5CJCYY4Z67hIu
5Cgkrb4XHSYXas72vy06EM/mA6JD2/xedBDcZO8QHSA+U/C7Md90qkSu7dK4fVvg0j71kXMdZ+rk
QPYtvngH+vM6FjyV/emOdfNMxHnyIiSDI7ScpgoC/yz6FjHXPpVdQTaR8QhEvtY+tu48AZe/Fdic
MFItb1VW1Y6QqjgIP2sBNWHOZwf2DcLr7TZT7AEACgW+ycOpMPMEoxA+q9x+hsdQtMMY4RTqh7Af
9ql5cd2s+jaxAng+2uCX4Xz5i0AEg1VToTg7hkn2cJKKOFNLSGVCud8PbUjkkMGcoG9D7h/XdMsQ
MPIfSJMs0R+QJvdBVIlUv0uacBWfo8+mKfE6ybCl2bGwTvB6ey57yhW2dYwSE5ubbCJjZ5Kq6ZqC
Wgtj9bqru1VrIpX0RO7u55wGy0jzF6WcjaHDFD7AYJWjYjQURU++YnDdaKlc5SH56EpT8tGADOPb
Kc9CMsZwrpI3yRiIwlTRPcu4KieebLTN8Hi6YR7TYyisCVxlPjWwDNIZNKMOyDARIdev7vNU+oqC
Xj3elodvQjlcKUJFvW8GRsSi9XhpsugwFAEsGm7dPTKSxOrlGZ5mIo8XcRkrT6j5oYpzyvOlmquv
jEZL0qduRJueO6BdBExlOzpJ5lLYOH0eucTbC8Q4v1LGt0vRtiOp99BBR57K8M7du64QI6NdhVnW
WceRY+s2V9zEyy+udYisy8lvmQcagQ+Hoisfa29rFUwMaVF3g59BMvYwpExC6TNZYyRDJFiSBnwt
wkx32d3noROP8E85ReRjNfGsRryrf4BnGqM+gGcm6R2IlDjbvjdEhq0ZE2CTfXOGQS9lRTb1Agoa
6pzdr1f0UyU5npQ3zMNPTTJSoir3FHU0qsou9IiBUsunJRQ01oIMDvQbi184+ZlGt+SQpZzqfhvS
yL9FaHQYgmef7XNxXTcezJi0YsYbcHgHjkOIlUpCLAtEhPWqIfCvRE1aUb9vXd1VPrEJAYyKvq0L
/sTB2XSea9DT6E0VvixwYQQFkndh04YdEnRaXGLwP2DkweDU2TfYG0ywLugokjwOSNaAgl5pyN6M
NOJ66USaqP+cNNFU7N1w9zgQBfPdoW4bD87oO2rSq98pbs1+XUMyPaM87JUAzb9p+oK/ACe2XNQx
GOqq/HXEH4wnVcEBy+PrxaF+AmNLpiau5aWMr9n46MjCowOCuUxPCgdU2VccXLkBuJExap/TQUTH
UHsc6j3fikb+eUSdxWIMcCO+fed5s42+6sNEF5Y2NZmVemNh8wN+6vu9u/GMvzIvoH7x4rtPq3/w
fNeo+fcH6nsbUocikVpSArY2qKJ0wzWoslakL3tGYKZVE1H1NKYZqgOfNN2dBjdMjlUK+jpu6PET
KoP/3eyW4nnQ3BnJv3E9najiUEEiiX+qUofRKLt+qpKYC5afef1UNdLeqS9K4Wil//YCkwmTZe9W
YK6rgNHZnQIDmMlFcgP1L3qxSqmvn6zgLvHV6xQD/zpFO8LS/ECFcPlAheA+WVZUBOP05Wx50ouI
DgGE0QHp6OBQdaZXtkoF3g53Umk3ZxH/OKJV1J04WLWWc7DS4DZYSeYpGFrHjX+p090JA2DhB2Zm
0+KmDQlM/9Q4ckuqr4BT+CU75X9++Jf3yZtcSuaCEKC+uH3Pfb8tvn2jjTEsooT4vqjc71zFZMz6
ta5kI3XXK+NZ+dGuEqBR1vtVAh64nsyfKariiUP4MiI9+fX/iZETR8SkumHJNa5huMC1sGhGegxm
n2CT8DspbRPWuzVtp6vRj1wynX8HlfB3ETqskAJ6uI61mX7Mgl2nEgQplyBJjItDxa/uuTPrh8Go
X4gUSNy4Mmj0mqEbjwAN1+NSwuQhBCx9evW/h1d/AA6wDRMKZW5kc3RyZWFtCmVuZG9iagoxMDQg
MCBvYmogPDwKL1R5cGUgL1BhZ2UKL0NvbnRlbnRzIDEwNSAwIFIKL1Jlc291cmNlcyAxMDMgMCBS
Ci9NZWRpYUJveCBbMCAwIDYxMiA3OTJdCi9QYXJlbnQgMjAgMCBSCi9Bbm5vdHMgWyAxMDIgMCBS
IF0KPj4gZW5kb2JqCjEwMiAwIG9iaiA8PAovVHlwZSAvQW5ub3QKL0JvcmRlclswIDAgMV0vSC9J
L0NbMCAxIDFdCi9SZWN0IFsyNDguNTI2IDE0Ny4yNjQgMjgyLjcwNiAxNjEuMjEyXQovU3VidHlw
ZS9MaW5rL0E8PC9UeXBlL0FjdGlvbi9TL1VSSS9VUkkoaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcv
SlRDMS9TQzIyL1dHMjEvZG9jcy9wYXBlcnMvMjAxMi9uMzQ0NC5odG1sKT4+Cj4+IGVuZG9iagox
MDYgMCBvYmogPDwKL0QgWzEwNCAwIFIgL1hZWiAxMDkuODU0IDcwNC4wNjMgbnVsbF0KPj4gZW5k
b2JqCjYgMCBvYmogPDwKL0QgWzEwNCAwIFIgL1hZWiAxMTAuODU0IDY2Ni4yMDIgbnVsbF0KPj4g
ZW5kb2JqCjEwMyAwIG9iaiA8PAovRm9udCA8PCAvRjIyIDE5IDAgUiAvRjE3IDE3IDAgUiAvRjMy
IDg1IDAgUiAvRjI4IDEwNyAwIFIgPj4KL1Byb2NTZXQgWyAvUERGIC9UZXh0IF0KPj4gZW5kb2Jq
CjExMCAwIG9iaiA8PAovTGVuZ3RoIDE2MCAgICAgICAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K
c3RyZWFtCnjaZY49D8IgEIb3/oobYSgKvaPtaqKDM5txwJSmJBaalpj470Xp5nRP3ue+TqY6XGQL
UoqeSIEZMx5FRwiaUChswQxwYzYMvG6UZj4Mzv24ZWny257uNQZXVBxLkCZXYFn9bNd3sXPkkiX/
4oTMJh/DPv7gteqYy3Ly4e/IssYlN+Tlm30KfjdXkL0UDRLUpFE0HZZn9ddVZ1N9AIUtOPQKZW5k
c3RyZWFtCmVuZG9iagoxMDkgMCBvYmogPDwKL1R5cGUgL1BhZ2UKL0NvbnRlbnRzIDExMCAwIFIK
L1Jlc291cmNlcyAxMDggMCBSCi9NZWRpYUJveCBbMCAwIDYxMiA3OTJdCi9QYXJlbnQgMjAgMCBS
Cj4+IGVuZG9iagoxMTEgMCBvYmogPDwKL0QgWzEwOSAwIFIgL1hZWiAxMTAuODUxIDcwNC4wNjMg
bnVsbF0KPj4gZW5kb2JqCjEwOCAwIG9iaiA8PAovRm9udCA8PCAvRjE3IDE3IDAgUiA+PgovUHJv
Y1NldCBbIC9QREYgL1RleHQgXQo+PiBlbmRvYmoKMTEyIDAgb2JqCls1MTMuNSA1MzQuOCA0NzQu
NCA0NzkuNSA0OTEuMyAzODMuN10KZW5kb2JqCjExMyAwIG9iagpbNDAwIDQwMCA1MDAgNzUwIDMw
MCAzNTAgMzAwIDUwMCA1MDAgNTAwIDUwMCA1MDAgNTAwIDUwMCA1MDAgNTAwIDUwMCA1MDAgMzAw
IDMwMCAzMDAgNzUwIDUwMCA1MDAgNzUwIDcyNi45IDY4OC40IDcwMCA3MzguNCA2NjMuNCA2Mzgu
NCA3NTYuNyA3MjYuOSAzNzYuOSA1MTMuNCA3NTEuOSA2MTMuNCA4NzYuOSA3MjYuOSA3NTAgNjYz
LjQgNzUwIDcxMy40IDU1MCA3MDAgNzI2LjkgNzI2LjkgOTc2LjkgNzI2LjkgNzI2LjkgNjAwIDMw
MCA1MDAgMzAwIDUwMCAzMDAgMzAwIDUwMCA0NTAgNDUwIDUwMCA0NTAgMzAwIDQ1MCA1MDAgMzAw
IDMwMCA0NTAgMjUwIDgwMCA1NTAgNTAwIDUwMCA0NTAgNDEyLjUgNDAwIDMyNSA1MjUgNDUwIDY1
MCA0NTAgNDc1IDQwMF0KZW5kb2JqCjExNCAwIG9iagpbNzc3LjggMjc3LjggNzc3LjggNTAwIDc3
Ny44IDUwMCA3NzcuOCA3NzcuOCA3NzcuOCA3NzcuOCA3NzcuOCA3NzcuOCA3NzcuOCAxMDAwIDUw
MCA1MDAgNzc3LjggNzc3LjggNzc3LjggNzc3LjggNzc3LjggNzc3LjggNzc3LjggNzc3LjggNzc3
LjggNzc3LjggNzc3LjggNzc3LjggMTAwMCAxMDAwIDc3Ny44IDc3Ny44IDEwMDAgMTAwMCA1MDAg
NTAwIDEwMDAgMTAwMCAxMDAwIDc3Ny44IDEwMDAgMTAwMCA2MTEuMSA2MTEuMSAxMDAwIDEwMDAg
MTAwMCA3NzcuOCAyNzUgMTAwMCA2NjYuNyA2NjYuNyA4ODguOSA4ODguOSAwIDAgNTU1LjYgNTU1
LjYgNjY2LjcgNTAwIDcyMi4yIDcyMi4yIDc3Ny44IDc3Ny44IDYxMS4xIDc5OC41IDY1Ni44IDUy
Ni41IDc3MS40IDUyNy44IDcxOC43IDU5NC45IDg0NC41IDU0NC41IDY3Ny44IDc2MS45IDY4OS43
IDEyMDAuOSA4MjAuNSA3OTYuMSA2OTUuNiA4MTYuNyA4NDcuNSA2MDUuNiA1NDQuNiA2MjUuOCA2
MTIuOCA5ODcuOCA3MTMuMyA2NjguMyA3MjQuNyA2NjYuNyA2NjYuNyA2NjYuNyA2NjYuNyA2NjYu
NyA2MTEuMSA2MTEuMSA0NDQuNCA0NDQuNCA0NDQuNCA0NDQuNCA1MDAgNTAwXQplbmRvYmoKMTE1
IDAgb2JqCls3NjEuNiA0ODkuNiA3NjEuNl0KZW5kb2JqCjExNiAwIG9iagpbNDM3LjUgNDM3LjUg
NTYyLjUgODc1IDMxMi41IDM3NSAzMTIuNSA1NjIuNSA1NjIuNSA1NjIuNSA1NjIuNSA1NjIuNSA1
NjIuNSA1NjIuNSA1NjIuNSA1NjIuNSA1NjIuNSA1NjIuNSAzMTIuNSAzMTIuNSAzNDIuNiA4NzUg
NTMxLjMgNTMxLjMgODc1IDg0OS41IDc5OS44IDgxMi41IDg2Mi4zIDczOC40IDcwNy4yIDg4NC4z
IDg3OS42IDQxOSA1ODEgODgwLjggNjc1LjkgMTA2Ny4xIDg3OS42IDg0NC45IDc2OC41IDg0NC45
IDgzOS4xIDYyNSA3ODIuNCA4NjQuNiA4NDkuNSAxMTYyIDg0OS41IDg0OS41IDY4Ny41IDMxMi41
IDU4MSAzMTIuNSA1NjIuNSAzMTIuNSAzMTIuNSA1NDYuOSA2MjUgNTAwIDYyNSA1MTMuMyAzNDMu
NyA1NjIuNSA2MjUgMzEyLjUgMzQzLjcgNTkzLjggMzEyLjUgOTM3LjUgNjI1IDU2Mi41IDYyNSA1
OTMuOCA0NTkuNSA0NDMuOCA0MzcuNSA2MjUgNTkzLjggODEyLjUgNTkzLjggNTkzLjggNTAwXQpl
bmRvYmoKMTE3IDAgb2JqCls1MTQuNiA1MTQuNiA1MTQuNiA1MTQuNiA1MTQuNiA1MTQuNiA1MTQu
NiA1MTQuNiA1MTQuNiA1MTQuNiA1MTQuNiA1MTQuNiA1MTQuNiA1MTQuNiA1MTQuNiA1MTQuNiA1
MTQuNiA1MTQuNiA1MTQuNiA1MTQuNiA1MTQuNiA1MTQuNiA1MTQuNiA1MTQuNiA1MTQuNiA1MTQu
NiA1MTQuNiA1MTQuNiA1MTQuNiA1MTQuNiA1MTQuNiA1MTQuNiA1MTQuNiA1MTQuNiA1MTQuNiA1
MTQuNiA1MTQuNiA1MTQuNiA1MTQuNiA1MTQuNiA1MTQuNiA1MTQuNiA1MTQuNiA1MTQuNiA1MTQu
NiA1MTQuNiA1MTQuNiA1MTQuNiA1MTQuNiA1MTQuNiA1MTQuNiA1MTQuNiA1MTQuNiA1MTQuNiA1
MTQuNiA1MTQuNiA1MTQuNiA1MTQuNiA1MTQuNiA1MTQuNiA1MTQuNiA1MTQuNiA1MTQuNiA1MTQu
NiA1MTQuNiA1MTQuNiA1MTQuNiA1MTQuNiA1MTQuNiA1MTQuNiA1MTQuNiA1MTQuNiA1MTQuNiA1
MTQuNiA1MTQuNiA1MTQuNl0KZW5kb2JqCjExOCAwIG9iagpbNTQ0IDU0NCA4MTYgODE2IDI3MiAy
OTkuMiA0ODkuNiA0ODkuNiA0ODkuNiA0ODkuNiA0ODkuNiA3MzQgNDM1LjIgNDg5LjYgNzA3LjIg
NzYxLjYgNDg5LjYgODgzLjggOTkyLjYgNzYxLjYgMjcyIDI3MiA0ODkuNiA4MTYgNDg5LjYgODE2
IDc2MS42IDI3MiAzODAuOCAzODAuOCA0ODkuNiA3NjEuNiAyNzIgMzI2LjQgMjcyIDQ4OS42IDQ4
OS42IDQ4OS42IDQ4OS42IDQ4OS42IDQ4OS42IDQ4OS42IDQ4OS42IDQ4OS42IDQ4OS42IDQ4OS42
IDI3MiAyNzIgMjcyIDc2MS42IDQ2Mi40IDQ2Mi40IDc2MS42IDczNCA2OTMuNCA3MDcuMiA3NDcu
OCA2NjYuMiA2MzkgNzY4LjMgNzM0IDM1My4yIDUwMyA3NjEuMiA2MTEuOCA4OTcuMiA3MzQgNzYx
LjYgNjY2LjIgNzYxLjYgNzIwLjYgNTQ0IDcwNy4yIDczNCA3MzQgMTAwNiA3MzQgNzM0IDU5OC40
IDI3MiA0ODkuNiAyNzIgNDg5LjYgMjcyIDI3MiA0ODkuNiA1NDQgNDM1LjIgNTQ0IDQzNS4yIDI5
OS4yIDQ4OS42IDU0NCAyNzIgMjk5LjIgNTE2LjggMjcyIDgxNiA1NDQgNDg5LjYgNTQ0IDUxNi44
IDM4MC44IDM4Ni4yIDM4MC44IDU0NCA1MTYuOCA3MDcuMiA1MTYuOCA1MTYuOCA0MzUuMiA0ODku
Nl0KZW5kb2JqCjExOSAwIG9iagpbNjAyLjEgNzI2LjMgNjkzLjMgMzI3LjYgNDcxLjUgNzE5LjQg
NTc2IDg1MCA2OTMuMyA3MTkuOCA2MjguMiA3MTkuOCA2ODAuNSA1MTAuOSA2NjcuNiA2OTMuMyA2
OTMuMyA5NTQuNSA2OTMuMyA2OTMuMyA1NjMuMSAyNDkuNiA0NTguNiAyNDkuNiA0NTguNiAyNDku
NiAyNDkuNiA0NTguNiA1MTAuOSA0MDYuNCA1MTAuOSA0MDYuNCAyNzUuOCA0NTguNiA1MTAuOSAy
NDkuNiAyNzUuOCA0ODQuNyAyNDkuNiA3NzIuMSA1MTAuOSA0NTguNiA1MTAuOSA0ODQuNyAzNTQu
MSAzNTkuNCAzNTQuMV0KZW5kb2JqCjEyMCAwIG9iaiA8PAovTGVuZ3RoMSAxODAxCi9MZW5ndGgy
IDEwMzExCi9MZW5ndGgzIDAKL0xlbmd0aCAxMTQzNiAgICAgCi9GaWx0ZXIgL0ZsYXRlRGVjb2Rl
Cj4+CnN0cmVhbQp42o20BVAb6BouDKVI8eJagjvBrUhxl+LFAwQIEiC4Oy3FixQpXlyLu7tDcS1Q
vLj7pbt7dvec/5+5dzKT5HldnvejpVRVZxUzszMBS9tBnVg52NgFARJK4jocnAB2di42dnZOVFpa
DYiTDfg/clRaLTDMEWIHFfyXhQQMDHJ6kkmCnJ4MleygAHlnGwAHF4CDV5CDT5CdHcDJzi7wH0M7
mCBAEuQCMQMosQHk7aBgR1RaCTt7dxjEwtLpKc9//gIYTBkBHAICfCx/uAPEbMEwiCkIClACOVmC
bZ8ymoJsAOp2phCwk/t/hWAQsnRyshcEAl1dXdlAto5sdjALEUYWgCvEyRKgBnYEw1zAZoDfLQOU
Qbbgv1pjQ6UFaFhCHP9UqNuZO7mCYGDAk8AGYgqGOj65OEPNwDDAU3aAupwiQMUeDP3TWPFPAxbA
X8MBcLBx/B3uL+/fgSDQP5xBpqZ2tvYgqDsEagEwh9iAASrSimxObk4sABDU7LchyMbR7skf5AKC
2IBMngz+KB0EkBZ7CwA9dfhXf46mMIi9kyObI8Tmd4/A32GexiwFNZOws7UFQ50cUX/XJwmBgU2f
5u4O/Gu51lA7V6jnf5A5BGpm/rsNM2d7oCYU4uAMlpP8y+ZJhPqPzALsBOBhZ2fn4xUAgB0AYDdT
S+DvBBru9uA/lBy/xU89eHva29kDzJ/aAHtDzMFPP6iejiAXMMAJ5gz29vy34r8RKgcHwAxi6gQw
AVtAoKj/RH8Sg83/xE/7h0HcAHrsT/TjALD//vz9z+CJYWZ2UBv3f8z/WDFQSU1SWleX+a+W/1aK
i9u5ATxZebgArJw8HAAODi4BAB8PO8D7v+P8PYH/dP+HVBUE+as69n8iykHN7QACfzbxNL3/NOLy
FzMY/jobRsB/Z1C2e+IzGMDwD/312XnYTZ++OP6fj+APl/8/7v+O8n+l//9WJO1sY/OHnuFPg/+P
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
KJMrHWiKeZi6UNJPQVDaKS9plJ1wtf/DlodIYTPqSiXQQpTuIlsc04H3UGjtSMdjBxRHO6BfsBKL
Ni/t7D4x26XGqE8ul5xWL5RXa0sregOihJqjaLn7q+20nim+eM/9DXJY4VRPXGOVc3r7deFZd48r
i8W0ver1fc2tv3X5s8+2V2Tn6LUsb9cIW/j89oICXa8XyrqD585KfpmpdAYTJevFBuvBrwoJDlwp
J+BeUqCsArHiIjpaMZAbfB3j8ki+99RHlLn0XikGN+W6+MS3iriGYpDXuHAGRtbQLNBlOs77/Oy0
5nXHuhHVpdxxXzI5pv2R0jmFEGZV/oIUmb7Dz/0iu5q947LBVb/C5+uQ3DKJMVRXdyWX3wuvbLpm
PLMyY/Dh7Ys5YngU5GqlgJb9jd4Q95s64GtTB0c+jJpWZm6jEaTMN6RB3iRwkxXXnem46dKGoIXS
dT/ESh0cxU8nC/bJ+YFU+x2Updyir4WkRW1BU5/Oxqv8XTyeDrcEh2azjTeAxeBdZeBB3tuVXPiL
G0+8Z2Qy1tqVt6ONkR1SPWNOCfaL5i/kY0EgZufJx8nPAV4H3zsqlBvl5Br1Pi6wXxVpoBqWbcZg
vL5x+zFdynh6znvwbgmm5GHa00VNgMuOv/MpDy3AuzaBZ+pqJwCoca0bk9gYTck4LHLekOnKoCtq
3LR4l/RqGNNsBuUXXL9+31Hn6FF8wRS8VVVKWplYWQGBOmOW20O+2204TbmM2LpiKA3PgkoH2ssS
fk/hlxuvkGSoDUT0urHyg6BY55uVlSey5hIEVz+XkbJycj5iye3/EoBF3gXwvPwm8EWNfrNXf8nc
3UmRtJUa8exrVbLY2YYDzfjOWKER1ieXkVyyhVLa9kb1+UGzsp97xqj/B5E5U4QKZW5kc3RyZWFt
CmVuZG9iagoxMjEgMCBvYmogPDwKL1R5cGUgL0ZvbnREZXNjcmlwdG9yCi9Gb250TmFtZSAvTVJE
RlpaK0NNQlgxMgovRmxhZ3MgNAovRm9udEJCb3ggWy01MyAtMjUxIDExMzkgNzUwXQovQXNjZW50
IDY5NAovQ2FwSGVpZ2h0IDY4NgovRGVzY2VudCAtMTk0Ci9JdGFsaWNBbmdsZSAwCi9TdGVtViAx
MDkKL1hIZWlnaHQgNDQ0Ci9DaGFyU2V0ICgvTS9QL1QvYS9jL2QvZS9mL2gvaS9sL20vbi9vL29u
ZS9wL3BhcmVubGVmdC9wYXJlbnJpZ2h0L3Ivcy9zZW1pY29sb24vdC90d28vdS92L3kveikKL0Zv
bnRGaWxlIDEyMCAwIFIKPj4gZW5kb2JqCjEyMiAwIG9iaiA8PAovTGVuZ3RoMSAxNDM4Ci9MZW5n
dGgyIDYwNTIKL0xlbmd0aDMgMAovTGVuZ3RoIDcwMjIgICAgICAKL0ZpbHRlciAvRmxhdGVEZWNv
ZGUKPj4Kc3RyZWFtCnjajVcHNNv9u6e21m7tEau1ib1qj9q7tooIoiQksamtVFF7b0LtUYpapUa1
FK09qvaqrWqUm473fe/7v/ece0/OSX7Pfj7f5/N8fyecrPpG/Ir2cDuIGhyG4gcKCEkDlHV0NIDC
ACEhEQEhIWFiTk5jKMoF8peemPM+BIGEwmHS/81DGQEBoTA6FRAK46gDhwE0PVwAQBEAUFwaKCEt
JAQQFhKS+ssRjpAGqIA8ofYAHQGAJhwGQRJzKsPdfBBQRycUps5fjwAuMDcAKCUlwfcrHKDoCkFA
wSAYQAeEcoK4YiqCQS4AIzgYCkH5/CsFl6wTCuUmLSjo5eUlAHJFCsARjnLcfAAvKMoJYAhBQhCe
EHvAT8gAXZAr5A80AWJOgLETFPnbYAR3QHmBEBAARuECBUNgSEyIB8weggBgqgOMNLQBem4Q2G9n
7d8OfIA/hwMACgD/Tvcn+mciKOxXMAgMhru6gWA+UJgjwAHqAgHoqWkLoLxRfAAQzP6nI8gFCcfE
gzxBUBeQHcbhV+sggJqiAQCEQfgHHxKMgLqhkAJIqMtPjII/02COWRVmrwx3dYXAUEjin/2pQBEQ
MObcfQT/DPchDO4F8/tLcoDC7B1+wrD3cBM0gUHdPSAaKn98MCrif3SOEBRATEhSQkRSHABxB0C8
wU6CPwsY+7hBfhmBP9UYDAF+bnA3gAMGBiQA6gDB/BD7IUGeEAAK4QEJ8Pvvhn9LxEAgwB4KRgHs
II5QGPE/2TFqiMNvGTN/BNQbYCmEoR8QIPTz8/eTNYZh9nCYi88/7r9GLGihrq5rcI/3D+S/jUpK
cG+AH78IEMAvLCYEAAoJiwMkMA8B/87z9wn8hf6XVh8E/dOd0D8ZNWAOcEye3ygwx/cXEs8/1OD6
szfcgH+X0IVjCA0BcP3DfyshMSEw5gv4/96CXyH/G/l/Zvk/+f+fHal5uLj8snP9dvgfdpAr1MXn
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
bnRCQm94IFstMzEgLTI1MCAxMDI2IDc1MF0KL0FzY2VudCA2OTQKL0NhcEhlaWdodCA2ODMKL0Rl
c2NlbnQgLTE5NAovSXRhbGljQW5nbGUgLTE0Ci9TdGVtViA2NQovWEhlaWdodCA0MzEKL0NoYXJT
ZXQgKC9ncmVhdGVyL2xlc3MpCi9Gb250RmlsZSAxMjIgMCBSCj4+IGVuZG9iagoxMjQgMCBvYmog
PDwKL0xlbmd0aDEgMTQzOAovTGVuZ3RoMiA2MzU0Ci9MZW5ndGgzIDAKL0xlbmd0aCA3MzI5ICAg
ICAgCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42o10BVSU7dY2ooCitErjA0PnDDB0
p3R3OQwDDDEDzNCCNEgIKCXdIIikoIKUdEinoICAhIiANMg36vuec97z/2t935q1nrl37+ve177Z
mHUN+OTt0LYIFTQKywfhB0sAilpaamIAGCzEDwYLErOxGSKxLoi/1MRsxggPDBKNkvgPB0UPBAyL
0ynBsDg/LTQKUPd0ASBCAEREAiIqAQYDgmCw+N+OaA8JQAnmhbQDtPgBdTQKgSFmU0S7+XogHRyx
uDJ/HwFOOBcAERcX5f0dDsi7IjyQcBgK0IJhHRGuuIpwmAtggIYjEVjff6TglHLEYt0kBAS8vb35
Ya4YfrSHgwwXL+CNxDoC+ggMwsMLYQf8Agxow1wRf5DxE7MBho5IzB+9Adoe6w3zQAA4hQsSjkBh
cBGeKDuEB4ArDhioaQI6bgjUH2fNPw68wF93A0D4If9K91f0r0RI1O9gGByOdnWDoXyRKAfAHumC
AHRUNPmxPlheAIay++UIc8GgcfEwLxjSBWaLc/jdOQxQkdcDYDiAf8HDwD2QblgMPwbp8guiwK80
uFtWRtkpol1dESgshvhXf0pIDwQcd+2+An8m64xCe6P8/xLskSg7+18g7DzdBIxQSHdPhJrSXy44
FfG/dQ4ILAAFi4kKiQkBCHcA4QN3FPiV3tDXDfHbCPmlxiEI8HdDuwH2OBCIAKQ9AvdH7I+BeSEA
rIcnIsD/Pw3/lIghEMAOCccCtggHJIr439lxaoT9Hxk3fA+kD2ABxnEPAoB//f51ssLRyw6NcvH9
t/vv+QqoKWoYaMvz/EH8L5uCAtoH8OcTFAb4BKFgAAKBgAFR3CHgn2n+dQF/g/+t1YUh/2oO/O+M
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
AwXae6geWn0ftY5oMFPNPYu/teRdzUA3F+DAtx1Y6I5wtg+reBwwWChCKyIaL47qFHtLmgPgbV8C
V1Z5uhsesQa8WqcGwWhPUf4MpUJnwi670uukT6pnIuy7updb2X3HzqTILJQi87Bnqm8OHX8yriud
ZHE9dx0x4rb7dqyjvJt2hf55rR5LNYXAVXL+2NWty3jlQpesEvu2ygmnnwbP9xFDiibeS5CQIxOa
AqiPo6XeGXhGEX2SPwZ5lrL55oIrLQaI0uTcPjhqp/G+tu7/meokGDxUJK2+iadKK3jtwIGk1jJf
Z8VBppmwxcGWcEStldtXxeGuUwp5pNKE3+1G/rIrAnBS4sa+4BpDi5M2uh58OuvY+6OhBYZ2PZ5s
fJ+IuDf/B/NsNrcKZW5kc3RyZWFtCmVuZG9iagoxMjUgMCBvYmogPDwKL1R5cGUgL0ZvbnREZXNj
cmlwdG9yCi9Gb250TmFtZSAvSUNLU05BK0NNTUk4Ci9GbGFncyA0Ci9Gb250QkJveCBbLTI0IC0y
NTAgMTExMCA3NTBdCi9Bc2NlbnQgNjk0Ci9DYXBIZWlnaHQgNjgzCi9EZXNjZW50IC0xOTQKL0l0
YWxpY0FuZ2xlIC0xNAovU3RlbVYgNzgKL1hIZWlnaHQgNDMxCi9DaGFyU2V0ICgvby9wL3QpCi9G
b250RmlsZSAxMjQgMCBSCj4+IGVuZG9iagoxMjYgMCBvYmogPDwKL0xlbmd0aDEgMjUxNgovTGVu
Z3RoMiAxODA2MQovTGVuZ3RoMyAwCi9MZW5ndGggMTk1MjAgICAgIAovRmlsdGVyIC9GbGF0ZURl
Y29kZQo+PgpzdHJlYW0KeNqM9wVQXInaBYriENw1QOPu7q7BPUDwxt3dPbi7u7sFd3d3CRYI7gS4
ZOacyZz/vap7iyro9cn6fO+GjEhBmU7IyMYAKG5j7UjHRM/IDRCRVWJiBjAystAzMjLDkpGpmDla
Av8jhiVTA9o7mNlYc//LQMQeqO/4LhPVd3y3k7WxBkg7WQKYWABM7NxMHNyMjABmRkau/xra2HMD
RPWdzYwAsvQAaRtroAMsmYiNrZu9mYmp43uY/34EUBpSAZi4uDho/3IHCFkB7c0M9a0BsvqOpkCr
94iG+pYAZRtDM6Cj2/9QUPKaOjracjMwuLi40OtbOdDb2JvwU9ECXMwcTQFKQAegvTPQCPC7YICc
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
mEWooKV77cWIgpa/vb1NocAr7IdkOTljJ4rXPkhmaFFE5TOva+lIK2NkrYsqcw543QXgMFPbTBZO
plLMTgJvQB/TPnf/bq3jwVxg3cOBWx6wsgm9PuxjVLFwb4UKRpmP61YKZW5kc3RyZWFtCmVuZG9i
agoxMjcgMCBvYmogPDwKL1R5cGUgL0ZvbnREZXNjcmlwdG9yCi9Gb250TmFtZSAvTUFHVEJBK0NN
UjEyCi9GbGFncyA0Ci9Gb250QkJveCBbLTM0IC0yNTEgOTg4IDc1MF0KL0FzY2VudCA2OTQKL0Nh
cEhlaWdodCA2ODMKL0Rlc2NlbnQgLTE5NAovSXRhbGljQW5nbGUgMAovU3RlbVYgNjUKL1hIZWln
aHQgNDMxCi9DaGFyU2V0ICgvQS9CL0MvRC9GL0cvSC9JL04vTy9QL1IvUy9UL1UvVy9hL2FtcGVy
c2FuZC9iL2JyYWNrZXRsZWZ0L2JyYWNrZXRyaWdodC9jL2NvbG9uL2NvbW1hL2QvZS9lbmRhc2gv
ZXF1YWwvZi9mZmkvZmkvZml2ZS9mbC9mb3VyL2cvaC9oeXBoZW4vaS9qL2svbC9tL24vbmluZS9v
L29uZS9wL3BhcmVubGVmdC9wYXJlbnJpZ2h0L3BlcmlvZC9wbHVzL3EvcXVlc3Rpb24vcXVvdGVk
YmxyaWdodC9xdW90ZXJpZ2h0L3Ivcy9zZW1pY29sb24vc2l4L3NsYXNoL3QvdGhyZWUvdHdvL3Uv
di93L3gveS96L3plcm8pCi9Gb250RmlsZSAxMjYgMCBSCj4+IGVuZG9iagoxMjggMCBvYmogPDwK
L0xlbmd0aDEgMTQ4NgovTGVuZ3RoMiA3MTY1Ci9MZW5ndGgzIDAKL0xlbmd0aCA4MTU3ICAgICAg
Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42o12BVRUXds2SEqXhNQgIA1DSXd3t8QA
AwwwM3RIdyrdXRKCdIeAlKR0SIdBdyMf+tT7vP+/1vets9acc92197Xv695r6GnUtdgkLOHmYFk4
zIWNkx0oCJBS0eTkAwCB3OxAIBcGPb02xMUe/KcZg14X7OQMgcME/yNAygkMcnmwSYNcHuJU4DCA
oqs9gJMbwPlCkJNPEAgEcAGBAn8Fwp0EAdIgN4glQIUdoAiHgZ0x6KXgDp5OEGsbl4dl/voEMFow
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
KMieznnFlVvz8XbzU2O2VoKjsexFIEtdGT+isC6eRYbJkzI8xQERn+pmfzkppeAUb2/eQJ60yT4N
RuOfm9Ijma3iLxzyiI5EhjbSntM9snTN8Jfbr44Q4BnIMdc25ts07AROnJuA6JXkLyYXFEdT0lTb
TTG+VCjoRxW1aOQg6UVV8wltl/Zh91aphX/kEjigX9mmekrMcfGm2MMBhf0kcyqYUsdnkC17Mw/V
3L50z907UaW5OQuSqC3TSbCZvx/FgkPvotaBSCZQF5lCnPWcoT5ldrPZejAR1B1DroPdRuV0kjOa
sMVulXb7fBAYTvJ5Ll56Y5YLOj7gcZj56njH3LXkplnAvRwBCjs1TnE0EKaw1O8A+4uFTa6P7W9e
6xgwqJVRnLxYOdjuMY5Fi+iZWwJiIF4EC1sTIO+2FVWeVVnzrMyKt/Qbnd4un3UIKMipWX0htbDM
izHEALyRtD0/Pln5EFlxkoR+Ifj6JnKsjxbrXXgwGy3ON4KnzKSjsclj4nK3by7s5owbgHkCyp1j
jI2sRxd69JVFqlkrx+OdJS+mBRxpz6ZjMJnoeObRtWpk5qRpGOnC7q3sGqWNFr5HsNbF/dhwSMbZ
/KTNOZpeJhnEM0v2lprLqk7fEbcPPgTeIK32DMlmf1MqFtKW7R+uzwazLfhE7MLS5iZpR1rViJYJ
tF+gLzd17T2Bao4F4BAtt+ZGfxFunZ+uJNlRmC+TLmyXJgs/ISB0g12xvOziR4vtMg64l7r3UQF1
i+GtF32uF8/U2GroJ4t1lAn7XqkbudkUfWAV4hNL9vSYXL8YP8PRz8PyxLx2/31LftHgzEaX1iT0
q0dCiBSV84czkCIphMBBfWT+iyw7Fjec8udytexuJsP/AMyt7j0KZW5kc3RyZWFtCmVuZG9iagox
MjkgMCBvYmogPDwKL1R5cGUgL0ZvbnREZXNjcmlwdG9yCi9Gb250TmFtZSAvS1ZXRU9CK0NNUjE3
Ci9GbGFncyA0Ci9Gb250QkJveCBbLTMzIC0yNTAgOTQ1IDc0OV0KL0FzY2VudCA2OTQKL0NhcEhl
aWdodCA2ODMKL0Rlc2NlbnQgLTE5NQovSXRhbGljQW5nbGUgMAovU3RlbVYgNTMKL1hIZWlnaHQg
NDMwCi9DaGFyU2V0ICgvRi9TL2EvYy9pL28vci90KQovRm9udEZpbGUgMTI4IDAgUgo+PiBlbmRv
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
+H42DMytzYiJ3OQdJZOEzi90zjF+rlfFyG4X3g/VCtLZWz6uTlzv0eASz4y7Cs02YGfzeLk6f/2D
b9Ukg/GT6Zl1SjiV8bvc0Hh5WSeuQ0h230+3W+afzc3IcYN4d7QrExM1I5wcgjWHwr7z7QUhc1Qa
u8Or3ARVO4v3WAaJ94j9ZEwYwueFm46EGdUVaue+Xp5OObKqv+x2UJg+UdajKI0hqfBhMHA7xmQM
b2LF97ygIfHwFGFrKMnolB4dswy+Jza7ONFm0ouXdshd1JPxHOEtKWZDv7ZtDik2noG/YAQyftkw
fFyuLV99C59u7OMSs5Gg2yQJpr40L2EGNfveGuRw4e1mjNcCI65f2WiZhDlWR0SE9qzuBbVTZtT/
AIZWfVsKZW5kc3RyZWFtCmVuZG9iagoxMzEgMCBvYmogPDwKL1R5cGUgL0ZvbnREZXNjcmlwdG9y
Ci9Gb250TmFtZSAvSFNGSkNLK0NNU1kxMAovRmxhZ3MgNAovRm9udEJCb3ggWy0yOSAtOTYwIDEx
MTYgNzc1XQovQXNjZW50IDc1MAovQ2FwSGVpZ2h0IDY4MwovRGVzY2VudCAtMTk0Ci9JdGFsaWNB
bmdsZSAtMTQKL1N0ZW1WIDQwCi9YSGVpZ2h0IDQzMQovQ2hhclNldCAoL2FzdGVyaXNrbWF0aC9i
cmFjZWxlZnQvYnJhY2VyaWdodC9taW51cykKL0ZvbnRGaWxlIDEzMCAwIFIKPj4gZW5kb2JqCjEz
MiAwIG9iaiA8PAovTGVuZ3RoMSAxOTI5Ci9MZW5ndGgyIDEyMjQwCi9MZW5ndGgzIDAKL0xlbmd0
aCAxMzQzNiAgICAgCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42o33BVCc29IFDOMQ
HILr4BLcNQR3d4LDAIPM4Brc3d3d3YKT4A7BJTgES/Dg8HHk3nPu+/9V31dTNfOs7tW9e+3dvZ8a
GgoVdWZRc4gpUAoCdmZmZ2ETAIgrasiycwDY2DhZ2Ng4kGloNEDOtsD/2JFptICOTiAIWOBfDHFH
oInzq03CxPmVqAgBA+RcbAHsnAB2HgF2XgE2NgAHGxv/f4gQRwGAhIkryBygyAKQg4CBTsg04hB7
D0eQpZXz6zr/eQTQmzEA2Pn5eZn+DAeI2gEdQWYmYICiibMV0O51RTMTW4A6xAwEdPb4nxT0QlbO
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
OySOWSlwWydvJZGPCu3h7+U0K66fhIW9FH7ljpyOcXuZPSnQ/mHxfGvpxda7lXo+/vsbueQvvOdI
QTX75+rTyR336/NFJIL52gy93B4s9wh1gZqEjt/RpEN6eZhHm4tmOvtfjBVQGeuHG0m/V8ReKpCh
QOWhcqgtMFB8xvLxx9ZGXsP+yUSeLIyGNVVbOThcoa1xRroLltOK2mIwsE2pU2Dtzwt9NK2fIYy9
RMcKq9Lfrh2G+gBqqrM7M0R492Sqh9Q+GSzsf9m8suvZY53TlPCB1ijd/HoV74g28dZJqbP1WHDz
mC5rhtsz7UBs+3m+lulqLH7cc8zWl9kgcbI1lRB79E0EPsIuFTbxz3ohwpArIlyuREdF/rM2D7XS
PhnBdscGH5WhFzMmyvdQljt7P4PZewHEPkETDNBHBxXkYion9gwPUvEcn04/LSzgOkdmpuK7igw+
gD/qctmLpNR0V+FVhrnhcnC1pJUXT0sio3zLFlLVvhd1jsowVzJyY9HU6anXnyGbUKULBJS5ggKf
UruM8KnU2jo2LspA01AMDYJOOWgpwv8Pmy0J9gplbmRzdHJlYW0KZW5kb2JqCjEzMyAwIG9iaiA8
PAovVHlwZSAvRm9udERlc2NyaXB0b3IKL0ZvbnROYW1lIC9KT0hYSFYrQ01USTEyCi9GbGFncyA0
Ci9Gb250QkJveCBbLTM2IC0yNTEgMTEwMyA3NTBdCi9Bc2NlbnQgNjk0Ci9DYXBIZWlnaHQgNjgz
Ci9EZXNjZW50IC0xOTQKL0l0YWxpY0FuZ2xlIC0xNAovU3RlbVYgNjMKL1hIZWlnaHQgNDMxCi9D
aGFyU2V0ICgvQi9EL0kvSy9PL1MvYS9iL2MvY29tbWEvZC9lL2YvaC9oeXBoZW4vaS9qL2wvbS9u
L28vcC9wYXJlbmxlZnQvcGFyZW5yaWdodC9wZXJpb2QvcS9yL3Mvc2xhc2gvdC91L3YveC95L3op
Ci9Gb250RmlsZSAxMzIgMCBSCj4+IGVuZG9iagoxMzQgMCBvYmogPDwKL0xlbmd0aDEgMTYzMAov
TGVuZ3RoMiAzNjc4Ci9MZW5ndGgzIDAKL0xlbmd0aCA0NjkyICAgICAgCi9GaWx0ZXIgL0ZsYXRl
RGVjb2RlCj4+CnN0cmVhbQp42o10CTjUbdR+JcnIVrK1+GXfZzGUJdl3spcQYxbzY8yMmbFlF0UK
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
NY1uLmEV6cfVB0YNzdK/DNQIpHe4VeZySrXr8zw1y5JruCgYlnziwKnsXQp+vfpC7K14o9KW6xW7
I/aWGtSOE+zmeaZDlx9D/GAUhKO9tH5M405qst7/AAJUTKwKZW5kc3RyZWFtCmVuZG9iagoxMzUg
MCBvYmogPDwKL1R5cGUgL0ZvbnREZXNjcmlwdG9yCi9Gb250TmFtZSAvU1VDRlFYK0NNVFQxMgov
RmxhZ3MgNAovRm9udEJCb3ggWy0xIC0yMzQgNTI0IDY5NV0KL0FzY2VudCA2MTEKL0NhcEhlaWdo
dCA2MTEKL0Rlc2NlbnQgLTIyMgovSXRhbGljQW5nbGUgMAovU3RlbVYgNjUKL1hIZWlnaHQgNDMx
Ci9DaGFyU2V0ICgvQy9EL0cvYS9hdC9jL2cvaS9sL20vbi9vL3BlcmlvZC9zL3Qvdi95KQovRm9u
dEZpbGUgMTM0IDAgUgo+PiBlbmRvYmoKMTkgMCBvYmogPDwKL1R5cGUgL0ZvbnQKL1N1YnR5cGUg
L1R5cGUxCi9CYXNlRm9udCAvTVJERlpaK0NNQlgxMgovRm9udERlc2NyaXB0b3IgMTIxIDAgUgov
Rmlyc3RDaGFyIDQwCi9MYXN0Q2hhciAxMjIKL1dpZHRocyAxMTYgMCBSCj4+IGVuZG9iagoyNyAw
IG9iaiA8PAovVHlwZSAvRm9udAovU3VidHlwZSAvVHlwZTEKL0Jhc2VGb250IC9aR0dOUUgrQ01N
STEyCi9Gb250RGVzY3JpcHRvciAxMjMgMCBSCi9GaXJzdENoYXIgNjAKL0xhc3RDaGFyIDYyCi9X
aWR0aHMgMTE1IDAgUgo+PiBlbmRvYmoKMTA3IDAgb2JqIDw8Ci9UeXBlIC9Gb250Ci9TdWJ0eXBl
IC9UeXBlMQovQmFzZUZvbnQgL0lDS1NOQStDTU1JOAovRm9udERlc2NyaXB0b3IgMTI1IDAgUgov
Rmlyc3RDaGFyIDExMQovTGFzdENoYXIgMTE2Ci9XaWR0aHMgMTEyIDAgUgo+PiBlbmRvYmoKMTcg
MCBvYmogPDwKL1R5cGUgL0ZvbnQKL1N1YnR5cGUgL1R5cGUxCi9CYXNlRm9udCAvTUFHVEJBK0NN
UjEyCi9Gb250RGVzY3JpcHRvciAxMjcgMCBSCi9GaXJzdENoYXIgMTIKL0xhc3RDaGFyIDEyMwov
V2lkdGhzIDExOCAwIFIKPj4gZW5kb2JqCjE2IDAgb2JqIDw8Ci9UeXBlIC9Gb250Ci9TdWJ0eXBl
IC9UeXBlMQovQmFzZUZvbnQgL0tWV0VPQitDTVIxNwovRm9udERlc2NyaXB0b3IgMTI5IDAgUgov
Rmlyc3RDaGFyIDcwCi9MYXN0Q2hhciAxMTYKL1dpZHRocyAxMTkgMCBSCj4+IGVuZG9iagozMSAw
IG9iaiA8PAovVHlwZSAvRm9udAovU3VidHlwZSAvVHlwZTEKL0Jhc2VGb250IC9IU0ZKQ0srQ01T
WTEwCi9Gb250RGVzY3JpcHRvciAxMzEgMCBSCi9GaXJzdENoYXIgMAovTGFzdENoYXIgMTAzCi9X
aWR0aHMgMTE0IDAgUgo+PiBlbmRvYmoKODUgMCBvYmogPDwKL1R5cGUgL0ZvbnQKL1N1YnR5cGUg
L1R5cGUxCi9CYXNlRm9udCAvSk9IWEhWK0NNVEkxMgovRm9udERlc2NyaXB0b3IgMTMzIDAgUgov
Rmlyc3RDaGFyIDQwCi9MYXN0Q2hhciAxMjIKL1dpZHRocyAxMTMgMCBSCj4+IGVuZG9iagoxOCAw
IG9iaiA8PAovVHlwZSAvRm9udAovU3VidHlwZSAvVHlwZTEKL0Jhc2VGb250IC9TVUNGUVgrQ01U
VDEyCi9Gb250RGVzY3JpcHRvciAxMzUgMCBSCi9GaXJzdENoYXIgNDYKL0xhc3RDaGFyIDEyMQov
V2lkdGhzIDExNyAwIFIKPj4gZW5kb2JqCjIwIDAgb2JqIDw8Ci9UeXBlIC9QYWdlcwovQ291bnQg
NgovS2lkcyBbMTAgMCBSIDIyIDAgUiA1OSAwIFIgODIgMCBSIDEwNCAwIFIgMTA5IDAgUl0KPj4g
ZW5kb2JqCjEzNiAwIG9iaiA8PAovVHlwZSAvT3V0bGluZXMKL0ZpcnN0IDMgMCBSCi9MYXN0IDcg
MCBSCi9Db3VudCAyCj4+IGVuZG9iago3IDAgb2JqIDw8Ci9UaXRsZSA4IDAgUgovQSA1IDAgUgov
UGFyZW50IDEzNiAwIFIKL1ByZXYgMyAwIFIKPj4gZW5kb2JqCjMgMCBvYmogPDwKL1RpdGxlIDQg
MCBSCi9BIDEgMCBSCi9QYXJlbnQgMTM2IDAgUgovTmV4dCA3IDAgUgo+PiBlbmRvYmoKMTM3IDAg
b2JqIDw8Ci9OYW1lcyBbKERvYy1TdGFydCkgMTUgMCBSIChsc3RsaXN0aW5nLi0xKSAyNSAwIFIg
KGxzdGxpc3RpbmcuLTIpIDQ4IDAgUiAobHN0bGlzdGluZy4tMykgNjIgMCBSIChsc3RsaXN0aW5n
Li00KSA3MCAwIFIgKGxzdGxpc3RpbmcuLTUpIDg2IDAgUl0KL0xpbWl0cyBbKERvYy1TdGFydCkg
KGxzdGxpc3RpbmcuLTUpXQo+PiBlbmRvYmoKMTM4IDAgb2JqIDw8Ci9OYW1lcyBbKGxzdGxpc3Rp
bmcuLTYpIDk2IDAgUiAobHN0bnVtYmVyLi0xLjEpIDI2IDAgUiAobHN0bnVtYmVyLi0xLjEwKSAz
NyAwIFIgKGxzdG51bWJlci4tMS4xMSkgMzggMCBSIChsc3RudW1iZXIuLTEuMTIpIDM5IDAgUiAo
bHN0bnVtYmVyLi0xLjEzKSA0MCAwIFJdCi9MaW1pdHMgWyhsc3RsaXN0aW5nLi02KSAobHN0bnVt
YmVyLi0xLjEzKV0KPj4gZW5kb2JqCjEzOSAwIG9iaiA8PAovTmFtZXMgWyhsc3RudW1iZXIuLTEu
MTQpIDQxIDAgUiAobHN0bnVtYmVyLi0xLjE1KSA0MiAwIFIgKGxzdG51bWJlci4tMS4xNikgNDMg
MCBSIChsc3RudW1iZXIuLTEuMTcpIDQ0IDAgUiAobHN0bnVtYmVyLi0xLjE4KSA0NSAwIFIgKGxz
dG51bWJlci4tMS4xOSkgNDYgMCBSXQovTGltaXRzIFsobHN0bnVtYmVyLi0xLjE0KSAobHN0bnVt
YmVyLi0xLjE5KV0KPj4gZW5kb2JqCjE0MCAwIG9iaiA8PAovTmFtZXMgWyhsc3RudW1iZXIuLTEu
MikgMjggMCBSIChsc3RudW1iZXIuLTEuMjApIDQ3IDAgUiAobHN0bnVtYmVyLi0xLjMpIDI5IDAg
UiAobHN0bnVtYmVyLi0xLjQpIDMwIDAgUiAobHN0bnVtYmVyLi0xLjUpIDMyIDAgUiAobHN0bnVt
YmVyLi0xLjYpIDMzIDAgUl0KL0xpbWl0cyBbKGxzdG51bWJlci4tMS4yKSAobHN0bnVtYmVyLi0x
LjYpXQo+PiBlbmRvYmoKMTQxIDAgb2JqIDw8Ci9OYW1lcyBbKGxzdG51bWJlci4tMS43KSAzNCAw
IFIgKGxzdG51bWJlci4tMS44KSAzNSAwIFIgKGxzdG51bWJlci4tMS45KSAzNiAwIFIgKGxzdG51
bWJlci4tMi4xKSA0OSAwIFIgKGxzdG51bWJlci4tMi4yKSA1MCAwIFIgKGxzdG51bWJlci4tMi4z
KSA1MSAwIFJdCi9MaW1pdHMgWyhsc3RudW1iZXIuLTEuNykgKGxzdG51bWJlci4tMi4zKV0KPj4g
ZW5kb2JqCjE0MiAwIG9iaiA8PAovTmFtZXMgWyhsc3RudW1iZXIuLTIuNCkgNTIgMCBSIChsc3Ru
dW1iZXIuLTIuNSkgNTMgMCBSIChsc3RudW1iZXIuLTIuNikgNTQgMCBSIChsc3RudW1iZXIuLTIu
NykgNTUgMCBSIChsc3RudW1iZXIuLTMuMSkgNjMgMCBSIChsc3RudW1iZXIuLTMuMikgNjQgMCBS
XQovTGltaXRzIFsobHN0bnVtYmVyLi0yLjQpIChsc3RudW1iZXIuLTMuMildCj4+IGVuZG9iagox
NDMgMCBvYmogPDwKL05hbWVzIFsobHN0bnVtYmVyLi0zLjMpIDY1IDAgUiAobHN0bnVtYmVyLi0z
LjQpIDY2IDAgUiAobHN0bnVtYmVyLi0zLjUpIDY3IDAgUiAobHN0bnVtYmVyLi0zLjYpIDY4IDAg
UiAobHN0bnVtYmVyLi0zLjcpIDY5IDAgUiAobHN0bnVtYmVyLi00LjEpIDcxIDAgUl0KL0xpbWl0
cyBbKGxzdG51bWJlci4tMy4zKSAobHN0bnVtYmVyLi00LjEpXQo+PiBlbmRvYmoKMTQ0IDAgb2Jq
IDw8Ci9OYW1lcyBbKGxzdG51bWJlci4tNC4yKSA3MiAwIFIgKGxzdG51bWJlci4tNC4zKSA3MyAw
IFIgKGxzdG51bWJlci4tNC40KSA3NCAwIFIgKGxzdG51bWJlci4tNC41KSA3NSAwIFIgKGxzdG51
bWJlci4tNC42KSA3NiAwIFIgKGxzdG51bWJlci4tNC43KSA3NyAwIFJdCi9MaW1pdHMgWyhsc3Ru
dW1iZXIuLTQuMikgKGxzdG51bWJlci4tNC43KV0KPj4gZW5kb2JqCjE0NSAwIG9iaiA8PAovTmFt
ZXMgWyhsc3RudW1iZXIuLTQuOCkgNzggMCBSIChsc3RudW1iZXIuLTQuOSkgNzkgMCBSIChsc3Ru
dW1iZXIuLTUuMSkgODcgMCBSIChsc3RudW1iZXIuLTUuMikgODggMCBSIChsc3RudW1iZXIuLTUu
MykgODkgMCBSIChsc3RudW1iZXIuLTUuNCkgOTAgMCBSXQovTGltaXRzIFsobHN0bnVtYmVyLi00
LjgpIChsc3RudW1iZXIuLTUuNCldCj4+IGVuZG9iagoxNDYgMCBvYmogPDwKL05hbWVzIFsobHN0
bnVtYmVyLi01LjUpIDkxIDAgUiAobHN0bnVtYmVyLi01LjYpIDkyIDAgUiAobHN0bnVtYmVyLi01
LjcpIDkzIDAgUiAobHN0bnVtYmVyLi01LjgpIDk0IDAgUiAobHN0bnVtYmVyLi01LjkpIDk1IDAg
UiAobHN0bnVtYmVyLi02LjEpIDk3IDAgUl0KL0xpbWl0cyBbKGxzdG51bWJlci4tNS41KSAobHN0
bnVtYmVyLi02LjEpXQo+PiBlbmRvYmoKMTQ3IDAgb2JqIDw8Ci9OYW1lcyBbKGxzdG51bWJlci4t
Ni4yKSA5OCAwIFIgKGxzdG51bWJlci4tNi4zKSA5OSAwIFIgKGxzdG51bWJlci4tNi40KSAxMDAg
MCBSIChsc3RudW1iZXIuLTYuNSkgMTAxIDAgUiAocGFnZS4xKSAxNCAwIFIgKHBhZ2UuMikgMjQg
MCBSXQovTGltaXRzIFsobHN0bnVtYmVyLi02LjIpIChwYWdlLjIpXQo+PiBlbmRvYmoKMTQ4IDAg
b2JqIDw8Ci9OYW1lcyBbKHBhZ2UuMykgNjEgMCBSIChwYWdlLjQpIDg0IDAgUiAocGFnZS41KSAx
MDYgMCBSIChwYWdlLjYpIDExMSAwIFIgKHNlY3Rpb24uMSkgMiAwIFIgKHNlY3Rpb24uMikgNiAw
IFJdCi9MaW1pdHMgWyhwYWdlLjMpIChzZWN0aW9uLjIpXQo+PiBlbmRvYmoKMTQ5IDAgb2JqIDw8
Ci9LaWRzIFsxMzcgMCBSIDEzOCAwIFIgMTM5IDAgUiAxNDAgMCBSIDE0MSAwIFIgMTQyIDAgUl0K
L0xpbWl0cyBbKERvYy1TdGFydCkgKGxzdG51bWJlci4tMy4yKV0KPj4gZW5kb2JqCjE1MCAwIG9i
aiA8PAovS2lkcyBbMTQzIDAgUiAxNDQgMCBSIDE0NSAwIFIgMTQ2IDAgUiAxNDcgMCBSIDE0OCAw
IFJdCi9MaW1pdHMgWyhsc3RudW1iZXIuLTMuMykgKHNlY3Rpb24uMildCj4+IGVuZG9iagoxNTEg
MCBvYmogPDwKL0tpZHMgWzE0OSAwIFIgMTUwIDAgUl0KL0xpbWl0cyBbKERvYy1TdGFydCkgKHNl
Y3Rpb24uMildCj4+IGVuZG9iagoxNTIgMCBvYmogPDwKL0Rlc3RzIDE1MSAwIFIKPj4gZW5kb2Jq
CjE1MyAwIG9iaiA8PAovVHlwZSAvQ2F0YWxvZwovUGFnZXMgMjAgMCBSCi9PdXRsaW5lcyAxMzYg
MCBSCi9OYW1lcyAxNTIgMCBSCi9QYWdlTW9kZS9Vc2VPdXRsaW5lcwovT3BlbkFjdGlvbiA5IDAg
Ugo+PiBlbmRvYmoKMTU0IDAgb2JqIDw8Ci9BdXRob3IoKS9UaXRsZSgpL1N1YmplY3QoKS9DcmVh
dG9yKExhVGVYIHdpdGggaHlwZXJyZWYgcGFja2FnZSkvUHJvZHVjZXIocGRmVGVYLTEuNDAuMTAp
L0tleXdvcmRzKCkKL0NyZWF0aW9uRGF0ZSAoRDoyMDEyMTExNTAyNDc0MS0wNScwMCcpCi9Nb2RE
YXRlIChEOjIwMTIxMTE1MDI0NzQxLTA1JzAwJykKL1RyYXBwZWQgL0ZhbHNlCi9QVEVYLkZ1bGxi
YW5uZXIgKFRoaXMgaXMgcGRmVGVYLCBWZXJzaW9uIDMuMTQxNTkyNi0xLjQwLjEwLTIuMiAoVGVY
IExpdmUgMjAwOS9EZWJpYW4pIGtwYXRoc2VhIHZlcnNpb24gNS4wLjApCj4+IGVuZG9iagp4cmVm
CjAgMTU1CjAwMDAwMDAwMDAgNjU1MzUgZiAKMDAwMDAwMDAxNSAwMDAwMCBuIAowMDAwMDAyMjA2
IDAwMDAwIG4gCjAwMDAxMDQ4MDMgMDAwMDAgbiAKMDAwMDAwMDA2MCAwMDAwMCBuIAowMDAwMDAw
MDg4IDAwMDAwIG4gCjAwMDAwMTc0NDYgMDAwMDAgbiAKMDAwMDEwNDczMiAwMDAwMCBuIAowMDAw
MDAwMTMzIDAwMDAwIG4gCjAwMDAwMDAxNjMgMDAwMDAgbiAKMDAwMDAwMTc0NyAwMDAwMCBuIAow
MDAwMDAxODc0IDAwMDAwIG4gCjAwMDAwMDIyNjUgMDAwMDAgbiAKMDAwMDAwMDIxMiAwMDAwMCBu
IAowMDAwMDAyMDg2IDAwMDAwIG4gCjAwMDAwMDIxNDYgMDAwMDAgbiAKMDAwMDEwMzk5MyAwMDAw
MCBuIAowMDAwMTAzODUxIDAwMDAwIG4gCjAwMDAxMDQ0MjAgMDAwMDAgbiAKMDAwMDEwMzQyMiAw
MDAwMCBuIAowMDAwMTA0NTYzIDAwMDAwIG4gCjAwMDAwMDY0MzEgMDAwMDAgbiAKMDAwMDAwNDUy
NSAwMDAwMCBuIAowMDAwMDAyMzcxIDAwMDAwIG4gCjAwMDAwMDQ2MzMgMDAwMDAgbiAKMDAwMDAw
NDY5MyAwMDAwMCBuIAowMDAwMDA0NzUzIDAwMDAwIG4gCjAwMDAxMDM1NjUgMDAwMDAgbiAKMDAw
MDAwNDgxMyAwMDAwMCBuIAowMDAwMDA0ODczIDAwMDAwIG4gCjAwMDAwMDQ5MzMgMDAwMDAgbiAK
MDAwMDEwNDEzNSAwMDAwMCBuIAowMDAwMDA0OTkzIDAwMDAwIG4gCjAwMDAwMDUwNTMgMDAwMDAg
biAKMDAwMDAwNTExMyAwMDAwMCBuIAowMDAwMDA1MTczIDAwMDAwIG4gCjAwMDAwMDUyMzMgMDAw
MDAgbiAKMDAwMDAwNTI5MyAwMDAwMCBuIAowMDAwMDA1MzUyIDAwMDAwIG4gCjAwMDAwMDU0MTIg
MDAwMDAgbiAKMDAwMDAwNTQ3MiAwMDAwMCBuIAowMDAwMDA1NTMyIDAwMDAwIG4gCjAwMDAwMDU1
OTIgMDAwMDAgbiAKMDAwMDAwNTY1MiAwMDAwMCBuIAowMDAwMDA1NzEyIDAwMDAwIG4gCjAwMDAw
MDU3NzIgMDAwMDAgbiAKMDAwMDAwNTgzMiAwMDAwMCBuIAowMDAwMDA1ODkyIDAwMDAwIG4gCjAw
MDAwMDU5NTIgMDAwMDAgbiAKMDAwMDAwNjAxMiAwMDAwMCBuIAowMDAwMDA2MDcyIDAwMDAwIG4g
CjAwMDAwMDYxMzIgMDAwMDAgbiAKMDAwMDAwNjE5MiAwMDAwMCBuIAowMDAwMDA2MjUyIDAwMDAw
IG4gCjAwMDAwMDYzMTIgMDAwMDAgbiAKMDAwMDAwNjM3MSAwMDAwMCBuIAowMDAwMDA5MDQ5IDAw
MDAwIG4gCjAwMDAwMDkyNjIgMDAwMDAgbiAKMDAwMDAxMDY1MyAwMDAwMCBuIAowMDAwMDA4OTE1
IDAwMDAwIG4gCjAwMDAwMDY1MzcgMDAwMDAgbiAKMDAwMDAwOTUxNSAwMDAwMCBuIAowMDAwMDA5
NTc1IDAwMDAwIG4gCjAwMDAwMDk2MzUgMDAwMDAgbiAKMDAwMDAwOTY5NSAwMDAwMCBuIAowMDAw
MDA5NzU1IDAwMDAwIG4gCjAwMDAwMDk4MTUgMDAwMDAgbiAKMDAwMDAwOTg3NSAwMDAwMCBuIAow
MDAwMDA5OTM1IDAwMDAwIG4gCjAwMDAwMDk5OTQgMDAwMDAgbiAKMDAwMDAxMDA1NCAwMDAwMCBu
IAowMDAwMDEwMTE0IDAwMDAwIG4gCjAwMDAwMTAxNzQgMDAwMDAgbiAKMDAwMDAxMDIzNCAwMDAw
MCBuIAowMDAwMDEwMjk0IDAwMDAwIG4gCjAwMDAwMTAzNTQgMDAwMDAgbiAKMDAwMDAxMDQxMyAw
MDAwMCBuIAowMDAwMDEwNDczIDAwMDAwIG4gCjAwMDAwMTA1MzMgMDAwMDAgbiAKMDAwMDAxMDU5
MyAwMDAwMCBuIAowMDAwMDEzNTE4IDAwMDAwIG4gCjAwMDAwMTQ3NTIgMDAwMDAgbiAKMDAwMDAx
MzM5MSAwMDAwMCBuIAowMDAwMDEwNzU5IDAwMDAwIG4gCjAwMDAwMTM3MzAgMDAwMDAgbiAKMDAw
MDEwNDI3NyAwMDAwMCBuIAowMDAwMDEzNzkwIDAwMDAwIG4gCjAwMDAwMTM4NTAgMDAwMDAgbiAK
MDAwMDAxMzkxMCAwMDAwMCBuIAowMDAwMDEzOTcwIDAwMDAwIG4gCjAwMDAwMTQwMzAgMDAwMDAg
biAKMDAwMDAxNDA5MCAwMDAwMCBuIAowMDAwMDE0MTUwIDAwMDAwIG4gCjAwMDAwMTQyMTAgMDAw
MDAgbiAKMDAwMDAxNDI3MCAwMDAwMCBuIAowMDAwMDE0MzMwIDAwMDAwIG4gCjAwMDAwMTQzOTAg
MDAwMDAgbiAKMDAwMDAxNDQ1MCAwMDAwMCBuIAowMDAwMDE0NTEwIDAwMDAwIG4gCjAwMDAwMTQ1
NzAgMDAwMDAgbiAKMDAwMDAxNDYzMCAwMDAwMCBuIAowMDAwMDE0NjkxIDAwMDAwIG4gCjAwMDAw
MTcxNzAgMDAwMDAgbiAKMDAwMDAxNzUwNiAwMDAwMCBuIAowMDAwMDE3MDM5IDAwMDAwIG4gCjAw
MDAwMTQ4NzAgMDAwMDAgbiAKMDAwMDAxNzM4NCAwMDAwMCBuIAowMDAwMTAzNzA3IDAwMDAwIG4g
CjAwMDAwMTgwMjggMDAwMDAgbiAKMDAwMDAxNzg1NSAwMDAwMCBuIAowMDAwMDE3NjE0IDAwMDAw
IG4gCjAwMDAwMTc5NjYgMDAwMDAgbiAKMDAwMDAxODA5OSAwMDAwMCBuIAowMDAwMDE4MTU0IDAw
MDAwIG4gCjAwMDAwMTg1NDcgMDAwMDAgbiAKMDAwMDAxOTE0OSAwMDAwMCBuIAowMDAwMDE5MTg2
IDAwMDAwIG4gCjAwMDAwMTk2NzEgMDAwMDAgbiAKMDAwMDAyMDE0NiAwMDAwMCBuIAowMDAwMDIw
NzU4IDAwMDAwIG4gCjAwMDAwMjEwNTUgMDAwMDAgbiAKMDAwMDAzMjYxMiAwMDAwMCBuIAowMDAw
MDMyOTE0IDAwMDAwIG4gCjAwMDAwNDAwNTYgMDAwMDAgbiAKMDAwMDA0MDI4OSAwMDAwMCBuIAow
MDAwMDQ3NzM4IDAwMDAwIG4gCjAwMDAwNDc5NjMgMDAwMDAgbiAKMDAwMDA2NzYwNCAwMDAwMCBu
IAowMDAwMDY4MTAyIDAwMDAwIG4gCjAwMDAwNzYzNzkgMDAwMDAgbiAKMDAwMDA3NjYxMSAwMDAw
MCBuIAowMDAwMDg0MjEyIDAwMDAwIG4gCjAwMDAwODQ0NzIgMDAwMDAgbiAKMDAwMDA5ODAyOSAw
MDAwMCBuIAowMDAwMDk4MzU0IDAwMDAwIG4gCjAwMDAxMDMxNjYgMDAwMDAgbiAKMDAwMDEwNDY1
OSAwMDAwMCBuIAowMDAwMTA0ODc0IDAwMDAwIG4gCjAwMDAxMDUwNzggMDAwMDAgbiAKMDAwMDEw
NTMwMSAwMDAwMCBuIAowMDAwMTA1NTI5IDAwMDAwIG4gCjAwMDAxMDU3NTAgMDAwMDAgbiAKMDAw
MDEwNTk3MCAwMDAwMCBuIAowMDAwMTA2MTkwIDAwMDAwIG4gCjAwMDAxMDY0MTAgMDAwMDAgbiAK
MDAwMDEwNjYzMCAwMDAwMCBuIAowMDAwMTA2ODUwIDAwMDAwIG4gCjAwMDAxMDcwNzAgMDAwMDAg
biAKMDAwMDEwNzI2OCAwMDAwMCBuIAowMDAwMTA3NDMzIDAwMDAwIG4gCjAwMDAxMDc1NTEgMDAw
MDAgbiAKMDAwMDEwNzY2OSAwMDAwMCBuIAowMDAwMTA3NzUwIDAwMDAwIG4gCjAwMDAxMDc3ODgg
MDAwMDAgbiAKMDAwMDEwNzkxMyAwMDAwMCBuIAp0cmFpbGVyCjw8IC9TaXplIDE1NQovUm9vdCAx
NTMgMCBSCi9JbmZvIDE1NCAwIFIKL0lEIFs8MUFBODJGMEIwNzIyMUQyQkNBRDMxQkExRDEwMzg0
Mjg+IDwxQUE4MkYwQjA3MjIxRDJCQ0FEMzFCQTFEMTAzODQyOD5dID4+CnN0YXJ0eHJlZgoxMDgy
MzkKJSVFT0YK
--e89a8ff1ca52c5732704ce83f575--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Thu, 15 Nov 2012 00:40:14 -0800 (PST)
Raw View
------=_Part_318_13746948.1352968814746
Content-Type: text/plain; charset=ISO-8859-1
My concern now is how... general `for` is as a looping construct.
In order to make it possible to do static looping, everything involved
needs to be constexpr. But I'm not sure there's a way to explicitly specify
that in an easy way.
For example, what exactly is the counter variable? Can that just be any
type fit for constexpr, or must it specifically be an `int`? Can you only
bump the counter by 1, or are we going to allow incrementing it by
arbitrary (presumably constexpr) values? And so forth.
I would like to see it tied down to something as absolutely strict as
possible in order to allow it to be implemented. From there, we can see if
we need to allow for more variety. What scares me about implementing it is
the use of arbitrary logic in the incrementing and testing the variable.
Even though it may be constexpr logic, the logic is still arbitrary.
For example:
static for(i; 0; sizeof...(Types); 1)
{
}
This will name the loop variable `i`, and it is an integer (always). It
will start with 0 and it will continue until it is exactly equal to the
third value. It will increment each time by 1. Each of the last three are
compile-time constant expressions.
What exactly `i` is is something that needs to be pinned down. It is
effectively a *literal*, not a variable. You can't modify it (which is why
I don't like the `i++` syntax for incrementing it). But despite the fact
that it changes value, you can use it in constexpr contexts. So it is
effectively a constexpr.
This seems pretty safe and implementable, while still getting most of the
power you would want.
On Wednesday, November 14, 2012 11:54:28 PM UTC-8, Clayto...@gmail.com
wrote:
>
> Hi Nicol,
>
> Short summary: You're absolutely right, and I've downgraded "Static
> Loops" to purely a proposal on "static for". The updated version is
> attached.
>
> Regarding static while and do...while -- I sat down to try to work
> through an example, and then realized I couldn't come up with one.
> Since identifiers with scope outside of the statement must be
> constexpr, and identifiers declared in the condition are destroyed
> after every iteration, there's no mechanism for the condition to ever
> change value -- you get infinite compile-time iteration. In other
> words, as far as I can tell, both reduce to the useless statement:
> static if(condition) { /* ill-formed program */ }
> So, you're absolutely right; I've removed them from the proposal, and
> renamed it accordingly. Thanks!
>
> Range-based for loops are a little trickier, as you say. Certainly
> these seem reasonable, just intuitively:
> static for (int i : {2, 3, 7})
> const int array[3] = {2, 3, 7}; static for (int i : array)
> const tuple<int, int, int> t = {2, 3, 7}; static for(int i : t)
> But you're right; actually defining standards language for this is
> difficult. I haven't convinced myself whether it's difficult in the
> sense of "hard to state concisely or implement", or difficult in the
> sense of "disruptive to existing code." Either way, I removed it from
> the proposal too :)
>
> I've also added the additional justification you provide; thanks for that!
>
>
> Christof: That's definitely an interesting proposal. Less flexible,
> in terms of what can be expressed there, but certainly more concise.
> (In terms of which fits more smoothly into the language -- well, if we
> assume static if is likely to become part of the language, then
> probably we're on different but similar footing. If static if isn't
> approved, then static for never had a chance anyway.) I'll admit the
> one thing that makes me uncomfortable is: right now parameter packs
> are basically free of semantics, just a comma-separated list in a
> sense. What you're suggesting starts to look like a compile-time
> constructor for a specific type of parameter pack. So, does it make
> sense to "create" a parameter pack? Anyway, if we're heading in a
> direction where we can manipulate parameter packs in more ways, then
> I'd be more comfortable if they were genuine types with constructors
> and access functions. So, just to go wild (not a
> carefully-thought-out suggestion), imagine that parameter packs had a
> genuine type, and that type could be manipulated:
>
> template<typename F, typename ... Types>
> void for_each(tuple<Types...> Tuple, F f)
> {
> const pack LoopPack = {0 .. sizeof...(Types)-1};
> assert(typeid(LoopTuple) == typeid(Types));
> f(get<LoopPack>(Tuple)) ...;
> }
>
> I'm leaving the .. for producing a range, but just trying to separate
> out that feature from the question of how you can manipulate the range
> like a parameter pack by making that conversion explicit. The
> downside is that now two features are needed, but from my end I guess
> I'd suggest you keep them separate somehow. Since we're just talking
> out loud here :)
>
> Thanks,
> Clayton
>
> On Sun, Nov 11, 2012 at 5:24 PM, Christof Meerwald <cme...@cmeerw.org<javascript:>>
> wrote:
> > On Sun, 11 Nov 2012 12:31:01 -0800 (PST), Clayto...@gmail.com<javascript:>wrote:
> >> I'd like to make a proposal that is complementary to N3329 (static if;
> >> available at
> >> http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3329.pdf),
> which
> >> is currently under consideration. I believe there is a strong case to
> be
> >> made that static iteration loops would fit nicely alongside static if.
> A
> >> draft proposal is attached (Static Loops.pdf). In brief, though, the
> goal
> >> is to provide an alternative to template recursion that more closely
> models
> >> the runtime language, but forces loop unrolling during translation.
> For
> >> example, the following function would do something like boost.fusion's
> >> for_each:
> >>
> >> template<typename F, typename ... Types>
> >> void for_each(tuple<Types...> Tuple, F f)
> >> {
> >> static for(size_t i = 0; i < sizeof...(Types); i++) {
> >> f(get<i>(Tuple));
> >> }
> >> }
> >
> > Over on the Standard Discussion group under the "switch statements"
> > thread I mentioned some alternative approach, see
> >
> https://groups.google.com/a/isocpp.org/d/msg/std-discussion/q4KhZaN9IOY/wVukypfFJBEJ
> > which would only require the addition of pack literals or constant
> > integral pack expressions (or whatever these would be called).
> > for_each could then be implemented as:
> >
> > template<typename F, typename ... Types>
> > void for_each(tuple<Types...> Tuple, F f)
> > {
> > f(get<0 .. sizeof...(Types) - 1>(Tuple)) ...;
> > }
> >
> > or using slightly different syntax as:
> >
> > template<typename F, typename ... Types>
> > void for_each(tuple<Types...> Tuple, F f)
> > {
> > f(get<0 : sizeof...(Types)>(Tuple)) ...;
> > }
> >
> > Well, you would also need to allow a pack expansion in an
> > expression-statement (for this example), but the main idea would be to
> > just add suitable syntax to write a range of integers as a pack (which
> > can then be expanded as usual). I believe this would be much easier to
> > implement than static for and might fit in more naturally into the
> > existing variadic template support and can be used in contexts where
> > "static for" can't be used (initializer lists) - and I am sure it will
> > please those who argue for brevity in C++'s syntax...
> >
> > BTW, I am just thinking out loud here...
> >
> >
> > Christof
> >
> > --
> >
> > http://cmeerw.org sip:cmeerw at cmeerw.org
> > mailto:cmeerw <javascript:> at cmeerw.org xmpp:cmeerw
> at cmeerw.org
> >
> > --
> >
> >
> >
>
--
------=_Part_318_13746948.1352968814746
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
My concern now is how... general `for` is as a looping construct.<br><br>In=
order to make it possible to do static looping, everything involved needs =
to be constexpr. But I'm not sure there's a way to explicitly specify that =
in an easy way.<br><br>For example, what exactly is the counter variable? C=
an that just be any type fit for constexpr, or must it specifically be an `=
int`? Can you only bump the counter by 1, or are we going to allow incremen=
ting it by arbitrary (presumably constexpr) values? And so forth.<br><br>I =
would like to see it tied down to something as absolutely strict as possibl=
e in order to allow it to be implemented. From there, we can see if we need=
to allow for more variety. What scares me about implementing it is the use=
of arbitrary logic in the incrementing and testing the variable. Even thou=
gh it may be constexpr logic, the logic is still arbitrary.<br><br>For exam=
ple:<br><br><div class=3D"prettyprint" style=3D"background-color: rgb(250, =
250, 250); border-color: rgb(187, 187, 187); border-style: solid; border-wi=
dth: 1px; word-wrap: break-word;"><code class=3D"prettyprint"><div class=3D=
"subprettyprint"><span style=3D"color: #008;" class=3D"styled-by-prettify">=
static</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> </s=
pan><span style=3D"color: #008;" class=3D"styled-by-prettify">for</span><sp=
an style=3D"color: #660;" class=3D"styled-by-prettify">(</span><span style=
=3D"color: #000;" class=3D"styled-by-prettify">i</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: #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=
"> </span><span style=3D"color: #008;" class=3D"styled-by-prettify">sizeof<=
/span><span style=3D"color: #660;" class=3D"styled-by-prettify">...(</span>=
<span style=3D"color: #606;" class=3D"styled-by-prettify">Types</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=
: #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"><br></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"color: #660;" class=3D"styled-by-prettify">}=
</span></div></code></div><br>This will name the loop variable `i`, and it =
is an integer (always). It will start with 0 and it will continue until it =
is exactly equal to the third value. It will increment each time by 1. Each=
of the last three are compile-time constant expressions.<br><br>What exact=
ly `i` is is something that needs to be pinned down. It is effectively a <i=
>literal</i>, not a variable. You can't modify it (which is why I don't lik=
e the `i++` syntax for incrementing it). But despite the fact that it chang=
es value, you can use it in constexpr contexts. So it is effectively a cons=
texpr.<br><br>This seems pretty safe and implementable, while still getting=
most of the power you would want.<br><br>On Wednesday, November 14, 2012 1=
1:54:28 PM UTC-8, Clayto...@gmail.com wrote:<blockquote class=3D"gmail_quot=
e" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;paddin=
g-left: 1ex;">Hi Nicol,
<br>
<br>Short summary: You're absolutely right, and I've downgraded "Stat=
ic
<br>Loops" to purely a proposal on "static for". The updated version =
is
<br>attached.
<br>
<br>Regarding static while and do...while -- I sat down to try to work
<br>through an example, and then realized I couldn't come up with one.
<br>Since identifiers with scope outside of the statement must be
<br>constexpr, and identifiers declared in the condition are destroyed
<br>after every iteration, there's no mechanism for the condition to ever
<br>change value -- you get infinite compile-time iteration. In other
<br>words, as far as I can tell, both reduce to the useless statement:
<br>static if(condition) { /* ill-formed program */ }
<br>So, you're absolutely right; I've removed them from the proposal, and
<br>renamed it accordingly. Thanks!
<br>
<br>Range-based for loops are a little trickier, as you say. Certainl=
y
<br>these seem reasonable, just intuitively:
<br>static for (int i : {2, 3, 7})
<br>const int array[3] =3D {2, 3, 7}; static for (int i : array)
<br>const tuple<int, int, int> t =3D {2, 3, 7}; static for(int i : t)
<br>But you're right; actually defining standards language for this is
<br>difficult. I haven't convinced myself whether it's difficult in t=
he
<br>sense of "hard to state concisely or implement", or difficult in the
<br>sense of "disruptive to existing code." Either way, I removed it =
from
<br>the proposal too :)
<br>
<br>I've also added the additional justification you provide; thanks for th=
at!
<br>
<br>
<br>Christof: That's definitely an interesting proposal. Less f=
lexible,
<br>in terms of what can be expressed there, but certainly more concise.
<br>(In terms of which fits more smoothly into the language -- well, if we
<br>assume static if is likely to become part of the language, then
<br>probably we're on different but similar footing. If static if isn=
't
<br>approved, then static for never had a chance anyway.) I'll admit =
the
<br>one thing that makes me uncomfortable is: right now parameter pac=
ks
<br>are basically free of semantics, just a comma-separated list in a
<br>sense. What you're suggesting starts to look like a compile-time
<br>constructor for a specific type of parameter pack. So, does it ma=
ke
<br>sense to "create" a parameter pack? Anyway, if we're heading in a
<br>direction where we can manipulate parameter packs in more ways, then
<br>I'd be more comfortable if they were genuine types with constructors
<br>and access functions. So, just to go wild (not a
<br>carefully-thought-out suggestion), imagine that parameter packs had a
<br>genuine type, and that type could be manipulated:
<br>
<br>template<typename F, typename ... Types>
<br>void for_each(tuple<Types...> Tuple, F f)
<br>{
<br> const pack LoopPack =3D {0 .. sizeof...(Types)-1};
<br> assert(typeid(LoopTuple) =3D=3D typeid(Types));
<br> f(get<LoopPack>(Tuple)) ...;
<br>}
<br>
<br>I'm leaving the .. for producing a range, but just trying to separate
<br>out that feature from the question of how you can manipulate the range
<br>like a parameter pack by making that conversion explicit. The
<br>downside is that now two features are needed, but from my end I guess
<br>I'd suggest you keep them separate somehow. Since we're just talk=
ing
<br>out loud here :)
<br>
<br>Thanks,
<br>Clayton
<br>
<br>On Sun, Nov 11, 2012 at 5:24 PM, Christof Meerwald <<a href=3D"javas=
cript:" target=3D"_blank" gdf-obfuscated-mailto=3D"vnASJcQt2goJ">cme...@cme=
erw.org</a>> wrote:
<br>> On Sun, 11 Nov 2012 12:31:01 -0800 (PST), <a href=3D"javascript:" =
target=3D"_blank" gdf-obfuscated-mailto=3D"vnASJcQt2goJ">Clayto...@gmail.co=
m</a> wrote:
<br>>> I'd like to make a proposal that is complementary to N3329 (st=
atic if;
<br>>> available at
<br>>> <a href=3D"http://www.open-std.org/jtc1/sc22/wg21/docs/papers/=
2012/n3329.pdf" target=3D"_blank">http://www.open-std.org/jtc1/<wbr>sc22/wg=
21/docs/papers/2012/<wbr>n3329.pdf</a>), which
<br>>> is currently under consideration. I believe there is a s=
trong case to be
<br>>> made that static iteration loops would fit nicely alongside st=
atic if. A
<br>>> draft proposal is attached (Static Loops.pdf). In brief,=
though, the goal
<br>>> is to provide an alternative to template recursion that more c=
losely models
<br>>> the runtime language, but forces loop unrolling during transla=
tion. For
<br>>> example, the following function would do something like boost.=
fusion's
<br>>> for_each:
<br>>>
<br>>> template<typename F, typename ... Types>
<br>>> void for_each(tuple<Types...> Tuple, F f)
<br>>> {
<br>>> static for(size_t i =3D 0; i < sizeof...(Types); i++=
) {
<br>>> f(get<i>(Tuple));
<br>>> }
<br>>> }
<br>>
<br>> Over on the Standard Discussion group under the "switch statements=
"
<br>> thread I mentioned some alternative approach, see
<br>> <a href=3D"https://groups.google.com/a/isocpp.org/d/msg/std-discus=
sion/q4KhZaN9IOY/wVukypfFJBEJ" target=3D"_blank">https://groups.google.com/=
a/<wbr>isocpp.org/d/msg/std-<wbr>discussion/q4KhZaN9IOY/<wbr>wVukypfFJBEJ</=
a>
<br>> which would only require the addition of pack literals or constant
<br>> integral pack expressions (or whatever these would be called).
<br>> for_each could then be implemented as:
<br>>
<br>> template<typename F, typename ... Types>
<br>> void for_each(tuple<Types...> Tuple, F f)
<br>> {
<br>> f(get<0 .. sizeof...(Types) - 1>(Tuple)) ...;
<br>> }
<br>>
<br>> or using slightly different syntax as:
<br>>
<br>> template<typename F, typename ... Types>
<br>> void for_each(tuple<Types...> Tuple, F f)
<br>> {
<br>> f(get<0 : sizeof...(Types)>(Tuple)) ...;
<br>> }
<br>>
<br>> Well, you would also need to allow a pack expansion in an
<br>> expression-statement (for this example), but the main idea would b=
e to
<br>> just add suitable syntax to write a range of integers as a pack (w=
hich
<br>> can then be expanded as usual). I believe this would be much easie=
r to
<br>> implement than static for and might fit in more naturally into the
<br>> existing variadic template support and can be used in contexts whe=
re
<br>> "static for" can't be used (initializer lists) - and I am sure it =
will
<br>> please those who argue for brevity in C++'s syntax...
<br>>
<br>> BTW, I am just thinking out loud here...
<br>>
<br>>
<br>> Christof
<br>>
<br>> --
<br>>
<br>> <a href=3D"http://cmeerw.org" target=3D"_blank">http://cmeerw.org<=
/a> &=
nbsp; sip:cmeerw at <a href=3D"http://cmeerw.org=
" target=3D"_blank">cmeerw.org</a>
<br>> mailto:<a href=3D"javascript:" target=3D"_blank" gdf-obfuscated-ma=
ilto=3D"vnASJcQt2goJ">cmeerw</a> at <a href=3D"http://cmeerw.org" target=3D=
"_blank">cmeerw.org</a> &n=
bsp; xmpp:cmeerw at <a href=3D"http://cmeerw.org" target=3D"_blank">=
cmeerw.org</a>
<br>>
<br>> --
<br>>
<br>>
<br>>
<br></blockquote>
<p></p>
-- <br />
<br />
<br />
<br />
------=_Part_318_13746948.1352968814746--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Thu, 15 Nov 2012 08:28:31 -0800 (PST)
Raw View
------=_Part_30_21624569.1352996911845
Content-Type: text/plain; charset=ISO-8859-1
An expansion of this proposal.
static if is neat in part because it can do conditional compilation. It's
not just something that goes in functions. You can have:
template<typename T>
class Something
{
public:
static if(std::is_convertible<T, int>::value)
{
operator int() {...}
}
};
Thus, if `T` is implicitly convertible to int, so too is `Something<T>`. To
do this before, we would have had to use SFINAE and specializations, would
would make this code obnoxious, especially if we wanted one for float or a
couple of other types. Now it's easy.
static for has the potential to be something similar. Though it does
require solving a problem:
template<typename ...T>
class Tuple
{
public:
static for(i; 0; sizeof...(T); 1)
{
T[i] variable@i;
}
template<int i>
T[i] &Get() {return variable@i;}
template<int i>
const T[i] &Get() const {return variable@i;}
Tuple(T&& ...t)
: variable@t<>(t)...
{
}
};
In the above code, the @ character represents the creation of a new
identifier string by pasting things together. `variable` is an identifier
name, and `i` is a constant expression which can resolve to a string that
contains only valid characters for an identifier name. If it's string name
would contain invalid identifier characters, then compilation would fail.
It would work just as well for `variable@1` or `variable@foo`.
The use of `t<>` in a parameter expansion expression means "index of t".
This could be a different operator like `t[]` or something else. I'm not
particularly wed to this syntax, but we do need an identifier concatenation
operator and an `index of pack` operator.
The reasons this is better than the current tuple implementations should be
obvious. Right now, tuple sizes are limited by recursion limits in
implementations. Once this is available, they would be limited only by
iteration limits, which should be a good deal larger. Furthermore, tuples
(unless they contain one element) can't be standard layout types. Nor can
they be trivial types. Even if the list of types is all standard layout or
trivial.
Now they can, because they're not built out of recursion.
This is really pretty pie-in-the-sky here, and should be considered a
separate (though related) part of the proposal. It may even tie into stuff
that the reflection working group is doing.
On Thursday, November 15, 2012 12:40:15 AM UTC-8, Nicol Bolas wrote:
>
> My concern now is how... general `for` is as a looping construct.
>
> In order to make it possible to do static looping, everything involved
> needs to be constexpr. But I'm not sure there's a way to explicitly specify
> that in an easy way.
>
> For example, what exactly is the counter variable? Can that just be any
> type fit for constexpr, or must it specifically be an `int`? Can you only
> bump the counter by 1, or are we going to allow incrementing it by
> arbitrary (presumably constexpr) values? And so forth.
>
> I would like to see it tied down to something as absolutely strict as
> possible in order to allow it to be implemented. From there, we can see if
> we need to allow for more variety. What scares me about implementing it is
> the use of arbitrary logic in the incrementing and testing the variable.
> Even though it may be constexpr logic, the logic is still arbitrary.
>
> For example:
>
> static for(i; 0; sizeof...(Types); 1)
> {
> }
>
> This will name the loop variable `i`, and it is an integer (always). It
> will start with 0 and it will continue until it is exactly equal to the
> third value. It will increment each time by 1. Each of the last three are
> compile-time constant expressions.
>
> What exactly `i` is is something that needs to be pinned down. It is
> effectively a *literal*, not a variable. You can't modify it (which is
> why I don't like the `i++` syntax for incrementing it). But despite the
> fact that it changes value, you can use it in constexpr contexts. So it is
> effectively a constexpr.
>
> This seems pretty safe and implementable, while still getting most of the
> power you would want.
>
> On Wednesday, November 14, 2012 11:54:28 PM UTC-8, Clayto...@gmail.comwrote:
>>
>> Hi Nicol,
>>
>> Short summary: You're absolutely right, and I've downgraded "Static
>> Loops" to purely a proposal on "static for". The updated version is
>> attached.
>>
>> Regarding static while and do...while -- I sat down to try to work
>> through an example, and then realized I couldn't come up with one.
>> Since identifiers with scope outside of the statement must be
>> constexpr, and identifiers declared in the condition are destroyed
>> after every iteration, there's no mechanism for the condition to ever
>> change value -- you get infinite compile-time iteration. In other
>> words, as far as I can tell, both reduce to the useless statement:
>> static if(condition) { /* ill-formed program */ }
>> So, you're absolutely right; I've removed them from the proposal, and
>> renamed it accordingly. Thanks!
>>
>> Range-based for loops are a little trickier, as you say. Certainly
>> these seem reasonable, just intuitively:
>> static for (int i : {2, 3, 7})
>> const int array[3] = {2, 3, 7}; static for (int i : array)
>> const tuple<int, int, int> t = {2, 3, 7}; static for(int i : t)
>> But you're right; actually defining standards language for this is
>> difficult. I haven't convinced myself whether it's difficult in the
>> sense of "hard to state concisely or implement", or difficult in the
>> sense of "disruptive to existing code." Either way, I removed it from
>> the proposal too :)
>>
>> I've also added the additional justification you provide; thanks for
>> that!
>>
>>
>> Christof: That's definitely an interesting proposal. Less flexible,
>> in terms of what can be expressed there, but certainly more concise.
>> (In terms of which fits more smoothly into the language -- well, if we
>> assume static if is likely to become part of the language, then
>> probably we're on different but similar footing. If static if isn't
>> approved, then static for never had a chance anyway.) I'll admit the
>> one thing that makes me uncomfortable is: right now parameter packs
>> are basically free of semantics, just a comma-separated list in a
>> sense. What you're suggesting starts to look like a compile-time
>> constructor for a specific type of parameter pack. So, does it make
>> sense to "create" a parameter pack? Anyway, if we're heading in a
>> direction where we can manipulate parameter packs in more ways, then
>> I'd be more comfortable if they were genuine types with constructors
>> and access functions. So, just to go wild (not a
>> carefully-thought-out suggestion), imagine that parameter packs had a
>> genuine type, and that type could be manipulated:
>>
>> template<typename F, typename ... Types>
>> void for_each(tuple<Types...> Tuple, F f)
>> {
>> const pack LoopPack = {0 .. sizeof...(Types)-1};
>> assert(typeid(LoopTuple) == typeid(Types));
>> f(get<LoopPack>(Tuple)) ...;
>> }
>>
>> I'm leaving the .. for producing a range, but just trying to separate
>> out that feature from the question of how you can manipulate the range
>> like a parameter pack by making that conversion explicit. The
>> downside is that now two features are needed, but from my end I guess
>> I'd suggest you keep them separate somehow. Since we're just talking
>> out loud here :)
>>
>> Thanks,
>> Clayton
>>
>> On Sun, Nov 11, 2012 at 5:24 PM, Christof Meerwald <cme...@cmeerw.org>
>> wrote:
>> > On Sun, 11 Nov 2012 12:31:01 -0800 (PST), Clayto...@gmail.com wrote:
>> >> I'd like to make a proposal that is complementary to N3329 (static if;
>> >> available at
>> >> http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3329.pdf),
>> which
>> >> is currently under consideration. I believe there is a strong case to
>> be
>> >> made that static iteration loops would fit nicely alongside static if.
>> A
>> >> draft proposal is attached (Static Loops.pdf). In brief, though, the
>> goal
>> >> is to provide an alternative to template recursion that more closely
>> models
>> >> the runtime language, but forces loop unrolling during translation.
>> For
>> >> example, the following function would do something like boost.fusion's
>> >> for_each:
>> >>
>> >> template<typename F, typename ... Types>
>> >> void for_each(tuple<Types...> Tuple, F f)
>> >> {
>> >> static for(size_t i = 0; i < sizeof...(Types); i++) {
>> >> f(get<i>(Tuple));
>> >> }
>> >> }
>> >
>> > Over on the Standard Discussion group under the "switch statements"
>> > thread I mentioned some alternative approach, see
>> >
>> https://groups.google.com/a/isocpp.org/d/msg/std-discussion/q4KhZaN9IOY/wVukypfFJBEJ
>> > which would only require the addition of pack literals or constant
>> > integral pack expressions (or whatever these would be called).
>> > for_each could then be implemented as:
>> >
>> > template<typename F, typename ... Types>
>> > void for_each(tuple<Types...> Tuple, F f)
>> > {
>> > f(get<0 .. sizeof...(Types) - 1>(Tuple)) ...;
>> > }
>> >
>> > or using slightly different syntax as:
>> >
>> > template<typename F, typename ... Types>
>> > void for_each(tuple<Types...> Tuple, F f)
>> > {
>> > f(get<0 : sizeof...(Types)>(Tuple)) ...;
>> > }
>> >
>> > Well, you would also need to allow a pack expansion in an
>> > expression-statement (for this example), but the main idea would be to
>> > just add suitable syntax to write a range of integers as a pack (which
>> > can then be expanded as usual). I believe this would be much easier to
>> > implement than static for and might fit in more naturally into the
>> > existing variadic template support and can be used in contexts where
>> > "static for" can't be used (initializer lists) - and I am sure it will
>> > please those who argue for brevity in C++'s syntax...
>> >
>> > BTW, I am just thinking out loud here...
>> >
>> >
>> > Christof
>> >
>> > --
>> >
>> > http://cmeerw.org sip:cmeerw at cmeerw.org
>> > mailto:cmeerw at cmeerw.org xmpp:cmeerw at cmeerw.org
>> >
>> > --
>> >
>> >
>> >
>>
>
--
------=_Part_30_21624569.1352996911845
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
An expansion of this proposal.<br><br>static if is neat in part because it =
can do conditional compilation. It's not just something that goes in functi=
ons. You can have:<br><br><div class=3D"prettyprint" style=3D"background-co=
lor: rgb(250, 250, 250); border-color: rgb(187, 187, 187); border-style: so=
lid; border-width: 1px; word-wrap: break-word;"><code class=3D"prettyprint"=
><div class=3D"subprettyprint"><span style=3D"color: #008;" class=3D"styled=
-by-prettify">template</span><span style=3D"color: #660;" class=3D"styled-b=
y-prettify"><</span><span style=3D"color: #008;" class=3D"styled-by-pret=
tify">typename</span><span style=3D"color: #000;" class=3D"styled-by-pretti=
fy"> T</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">class</span><spa=
n style=3D"color: #000;" class=3D"styled-by-prettify"> </span><span style=
=3D"color: #606;" class=3D"styled-by-prettify">Something</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: #008;" cla=
ss=3D"styled-by-prettify">public</span><span style=3D"color: #660;" class=
=3D"styled-by-prettify">:</span><span style=3D"color: #000;" class=3D"style=
d-by-prettify"><br> </span><span style=3D"color: #008;" class=3D"styl=
ed-by-prettify">static</span><span style=3D"color: #000;" class=3D"styled-b=
y-prettify"> </span><span style=3D"color: #008;" class=3D"styled-by-prettif=
y">if</span><span style=3D"color: #660;" class=3D"styled-by-prettify">(</sp=
an><span style=3D"color: #000;" class=3D"styled-by-prettify">std</span><spa=
n style=3D"color: #660;" class=3D"styled-by-prettify">::</span><span class=
=3D"mw-geshi cpp source-cpp"><span style=3D"color: #000;" class=3D"styled-b=
y-prettify">is_convertible</span><span class=3D"sy4"></span></span><span st=
yle=3D"color: #660;" class=3D"styled-by-prettify"><</span><span style=3D=
"color: #000;" class=3D"styled-by-prettify">T</span><span style=3D"color: #=
660;" class=3D"styled-by-prettify">,</span><span style=3D"color: #000;" cla=
ss=3D"styled-by-prettify"> </span><span style=3D"color: #008;" class=3D"sty=
led-by-prettify">int</span><span style=3D"color: #660;" class=3D"styled-by-=
prettify">>::</span><span style=3D"color: #000;" class=3D"styled-by-pret=
tify">value</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-prettify"><br>  =
; </span><span style=3D"color: #008;" class=3D"styled-by-prettify">operator=
</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> </span><s=
pan style=3D"color: #008;" class=3D"styled-by-prettify">int</span><span sty=
le=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: #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;" c=
lass=3D"styled-by-prettify">}</span><span style=3D"color: #000;" class=3D"s=
tyled-by-prettify"><br></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></div></code></div><br>Thus, if `T` is implicitly convertib=
le to int, so too is `Something<T>`. To do this before, we would have=
had to use SFINAE and specializations, would would make this code obnoxiou=
s, especially if we wanted one for float or a couple of other types. Now it=
's easy.<br><br>static for has the potential to be something similar. Thoug=
h it does require solving a problem:<br><br><div class=3D"prettyprint" styl=
e=3D"background-color: rgb(250, 250, 250); border-color: rgb(187, 187, 187)=
; border-style: solid; border-width: 1px; word-wrap: break-word;"><code cla=
ss=3D"prettyprint"><div class=3D"subprettyprint"><span style=3D"color: #008=
;" class=3D"styled-by-prettify">template</span><span style=3D"color: #660;"=
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: #660;" class=3D"style=
d-by-prettify">...</span><span style=3D"color: #000;" class=3D"styled-by-pr=
ettify">T</span><span style=3D"color: #660;" class=3D"styled-by-prettify">&=
gt;</span><span style=3D"color: #000;" class=3D"styled-by-prettify"><br></s=
pan><span style=3D"color: #008;" class=3D"styled-by-prettify">class</span><=
span style=3D"color: #000;" class=3D"styled-by-prettify"> </span><span styl=
e=3D"color: #606;" class=3D"styled-by-prettify">Tuple</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: #008;" class=
=3D"styled-by-prettify">public</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-b=
y-prettify">static</span><span style=3D"color: #000;" class=3D"styled-by-pr=
ettify"> </span><span style=3D"color: #008;" class=3D"styled-by-prettify">f=
or</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 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: #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"style=
d-by-prettify"> </span><span style=3D"color: #008;" class=3D"styled-by-pret=
tify">sizeof</span><span style=3D"color: #660;" class=3D"styled-by-prettify=
">...(</span><span style=3D"color: #000;" class=3D"styled-by-prettify">T</s=
pan><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: #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"><br> </span><span style=3D"color: #660;"=
class=3D"styled-by-prettify">{</span><span style=3D"color: #000;" class=3D=
"styled-by-prettify"><br> T</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 style=3D"color: #660;" class=3D"styled-b=
y-prettify">]</span><span style=3D"color: #000;" class=3D"styled-by-prettif=
y"> variable@i</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-prettify">}</s=
pan><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><span style=3D"color: #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"styled-by-prettify">></span><span style=3D"color=
: #000;" class=3D"styled-by-prettify"><br> T</span><span style=3D"col=
or: #660;" class=3D"styled-by-prettify">[</span><span style=3D"color: #000;=
" class=3D"styled-by-prettify">i</span><span style=3D"color: #660;" class=
=3D"styled-by-prettify">]</span><span style=3D"color: #000;" class=3D"style=
d-by-prettify"> </span><span style=3D"color: #660;" class=3D"styled-by-pret=
tify">&</span><span style=3D"color: #606;" class=3D"styled-by-prettify"=
>Get</span><span style=3D"color: #660;" class=3D"styled-by-prettify">()</sp=
an><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: #008;" class=3D"styled-by-prettify">return</span><span style=3D"colo=
r: #000;" class=3D"styled-by-prettify"> variable@i</span><span style=3D"col=
or: #660;" class=3D"styled-by-prettify">;}</span><span style=3D"color: #000=
;" class=3D"styled-by-prettify"><br></span><br><span style=3D"color: #000;"=
class=3D"styled-by-prettify"><code class=3D"prettyprint"><span style=3D"co=
lor: #000;" class=3D"styled-by-prettify"> </span><span style=3D"color=
: #008;" class=3D"styled-by-prettify">template</span><span style=3D"color: =
#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"styl=
ed-by-prettify">></span><span style=3D"color: #000;" class=3D"styled-by-=
prettify"><br> const T</span><span style=3D"color: #660;" class=3D"st=
yled-by-prettify">[</span><span style=3D"color: #000;" class=3D"styled-by-p=
rettify">i</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: #606;" class=3D"styled-by-prettify">Get</span><span style=
=3D"color: #660;" class=3D"styled-by-prettify">()</span><span style=3D"colo=
r: #000;" class=3D"styled-by-prettify"> </span><span style=3D"color: #660;"=
class=3D"styled-by-prettify">const {</span><span style=3D"color: #008;" cl=
ass=3D"styled-by-prettify">return</span><span style=3D"color: #000;" class=
=3D"styled-by-prettify"> variable@i</span><span style=3D"color: #660;" clas=
s=3D"styled-by-prettify">;}</span><span style=3D"color: #000;" class=3D"sty=
led-by-prettify"><br></span><span style=3D"color: #000;" class=3D"styled-by=
-prettify"><br></span></code> </span><span style=3D"color: #606;" cla=
ss=3D"styled-by-prettify">Tuple</span><span style=3D"color: #660;" class=3D=
"styled-by-prettify">(</span><span style=3D"color: #000;" class=3D"styled-b=
y-prettify">T</span><span style=3D"color: #660;" class=3D"styled-by-prettif=
y">&&</span><span style=3D"color: #000;" class=3D"styled-by-prettif=
y"> </span><span style=3D"color: #660;" class=3D"styled-by-prettify">...</s=
pan><span style=3D"color: #000;" class=3D"styled-by-prettify">t</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"> variable@t</span><span style=3D=
"color: #660;" class=3D"styled-by-prettify"><>(</span><span style=3D"=
color: #000;" class=3D"styled-by-prettify">t</span><span style=3D"color: #6=
60;" 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;" 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-b=
y-prettify"><br></span><span style=3D"color: #660;" class=3D"styled-by-pret=
tify">};</span><span style=3D"color: #000;" class=3D"styled-by-prettify"><b=
r></span></div></code></div><br>In the above code, the @ character represen=
ts the creation of a new identifier string by pasting things together. `var=
iable` is an identifier name, and `i` is a constant expression which can re=
solve to a string that contains only valid characters for an identifier nam=
e. If it's string name would contain invalid identifier characters, then co=
mpilation would fail. It would work just as well for `variable@1` or `varia=
ble@foo`.<br><br>The use of `t<>` in a parameter expansion expression=
means "index of t". This could be a different operator like `t[]` or somet=
hing else. I'm not particularly wed to this syntax, but we do need an ident=
ifier concatenation operator and an `index of pack` operator.<br><br>The re=
asons this is better than the current tuple implementations should be obvio=
us. Right now, tuple sizes are limited by recursion limits in implementatio=
ns. Once this is available, they would be limited only by iteration limits,=
which should be a good deal larger. Furthermore, tuples (unless they conta=
in one element) can't be standard layout types. Nor can they be trivial typ=
es. Even if the list of types is all standard layout or trivial.<br><br>Now=
they can, because they're not built out of recursion.<br><br>This is reall=
y pretty pie-in-the-sky here, and should be considered a separate (though r=
elated) part of the proposal. It may even tie into stuff that the reflectio=
n working group is doing.<br><br>On Thursday, November 15, 2012 12:40:15 AM=
UTC-8, Nicol Bolas wrote:<blockquote class=3D"gmail_quote" style=3D"margin=
: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;">My c=
oncern now is how... general `for` is as a looping construct.<br><br>In ord=
er to make it possible to do static looping, everything involved needs to b=
e constexpr. But I'm not sure there's a way to explicitly specify that in a=
n easy way.<br><br>For example, what exactly is the counter variable? Can t=
hat just be any type fit for constexpr, or must it specifically be an `int`=
? Can you only bump the counter by 1, or are we going to allow incrementing=
it by arbitrary (presumably constexpr) values? And so forth.<br><br>I woul=
d like to see it tied down to something as absolutely strict as possible in=
order to allow it to be implemented. From there, we can see if we need to =
allow for more variety. What scares me about implementing it is the use of =
arbitrary logic in the incrementing and testing the variable. Even though i=
t may be constexpr logic, the logic is still arbitrary.<br><br>For example:=
<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">static</span><span style=3D"color:#000"> </=
span><span style=3D"color:#008">for</span><span style=3D"color:#660">(</spa=
n><span style=3D"color:#000">i</span><span style=3D"color:#660">;</span><sp=
an style=3D"color:#000"> </span><span style=3D"color:#066">0</span><span st=
yle=3D"color:#660">;</span><span style=3D"color:#000"> </span><span style=
=3D"color:#008">sizeof</span><span style=3D"color:#660">...(</span><span st=
yle=3D"color:#606">Types</span><span style=3D"color:#660">);</span><span st=
yle=3D"color:#000"> </span><span style=3D"color:#066">1</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>This will name the loop vari=
able `i`, and it is an integer (always). It will start with 0 and it will c=
ontinue until it is exactly equal to the third value. It will increment eac=
h time by 1. Each of the last three are compile-time constant expressions.<=
br><br>What exactly `i` is is something that needs to be pinned down. It is=
effectively a <i>literal</i>, not a variable. You can't modify it (which i=
s why I don't like the `i++` syntax for incrementing it). But despite the f=
act that it changes value, you can use it in constexpr contexts. So it is e=
ffectively a constexpr.<br><br>This seems pretty safe and implementable, wh=
ile still getting most of the power you would want.<br><br>On Wednesday, No=
vember 14, 2012 11:54:28 PM UTC-8, <a>Clayto...@gmail.com</a> wrote:<blockq=
uote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-left:=
1px #ccc solid;padding-left:1ex">Hi Nicol,
<br>
<br>Short summary: You're absolutely right, and I've downgraded "Stat=
ic
<br>Loops" to purely a proposal on "static for". The updated version =
is
<br>attached.
<br>
<br>Regarding static while and do...while -- I sat down to try to work
<br>through an example, and then realized I couldn't come up with one.
<br>Since identifiers with scope outside of the statement must be
<br>constexpr, and identifiers declared in the condition are destroyed
<br>after every iteration, there's no mechanism for the condition to ever
<br>change value -- you get infinite compile-time iteration. In other
<br>words, as far as I can tell, both reduce to the useless statement:
<br>static if(condition) { /* ill-formed program */ }
<br>So, you're absolutely right; I've removed them from the proposal, and
<br>renamed it accordingly. Thanks!
<br>
<br>Range-based for loops are a little trickier, as you say. Certainl=
y
<br>these seem reasonable, just intuitively:
<br>static for (int i : {2, 3, 7})
<br>const int array[3] =3D {2, 3, 7}; static for (int i : array)
<br>const tuple<int, int, int> t =3D {2, 3, 7}; static for(int i : t)
<br>But you're right; actually defining standards language for this is
<br>difficult. I haven't convinced myself whether it's difficult in t=
he
<br>sense of "hard to state concisely or implement", or difficult in the
<br>sense of "disruptive to existing code." Either way, I removed it =
from
<br>the proposal too :)
<br>
<br>I've also added the additional justification you provide; thanks for th=
at!
<br>
<br>
<br>Christof: That's definitely an interesting proposal. Less f=
lexible,
<br>in terms of what can be expressed there, but certainly more concise.
<br>(In terms of which fits more smoothly into the language -- well, if we
<br>assume static if is likely to become part of the language, then
<br>probably we're on different but similar footing. If static if isn=
't
<br>approved, then static for never had a chance anyway.) I'll admit =
the
<br>one thing that makes me uncomfortable is: right now parameter pac=
ks
<br>are basically free of semantics, just a comma-separated list in a
<br>sense. What you're suggesting starts to look like a compile-time
<br>constructor for a specific type of parameter pack. So, does it ma=
ke
<br>sense to "create" a parameter pack? Anyway, if we're heading in a
<br>direction where we can manipulate parameter packs in more ways, then
<br>I'd be more comfortable if they were genuine types with constructors
<br>and access functions. So, just to go wild (not a
<br>carefully-thought-out suggestion), imagine that parameter packs had a
<br>genuine type, and that type could be manipulated:
<br>
<br>template<typename F, typename ... Types>
<br>void for_each(tuple<Types...> Tuple, F f)
<br>{
<br> const pack LoopPack =3D {0 .. sizeof...(Types)-1};
<br> assert(typeid(LoopTuple) =3D=3D typeid(Types));
<br> f(get<LoopPack>(Tuple)) ...;
<br>}
<br>
<br>I'm leaving the .. for producing a range, but just trying to separate
<br>out that feature from the question of how you can manipulate the range
<br>like a parameter pack by making that conversion explicit. The
<br>downside is that now two features are needed, but from my end I guess
<br>I'd suggest you keep them separate somehow. Since we're just talk=
ing
<br>out loud here :)
<br>
<br>Thanks,
<br>Clayton
<br>
<br>On Sun, Nov 11, 2012 at 5:24 PM, Christof Meerwald <<a>cme...@cmeerw=
..org</a>> wrote:
<br>> On Sun, 11 Nov 2012 12:31:01 -0800 (PST), <a>Clayto...@gmail.com</=
a> wrote:
<br>>> I'd like to make a proposal that is complementary to N3329 (st=
atic if;
<br>>> available at
<br>>> <a href=3D"http://www.open-std.org/jtc1/sc22/wg21/docs/papers/=
2012/n3329.pdf" target=3D"_blank">http://www.open-std.org/jtc1/<wbr>sc22/wg=
21/docs/papers/2012/<wbr>n3329.pdf</a>), which
<br>>> is currently under consideration. I believe there is a s=
trong case to be
<br>>> made that static iteration loops would fit nicely alongside st=
atic if. A
<br>>> draft proposal is attached (Static Loops.pdf). In brief,=
though, the goal
<br>>> is to provide an alternative to template recursion that more c=
losely models
<br>>> the runtime language, but forces loop unrolling during transla=
tion. For
<br>>> example, the following function would do something like boost.=
fusion's
<br>>> for_each:
<br>>>
<br>>> template<typename F, typename ... Types>
<br>>> void for_each(tuple<Types...> Tuple, F f)
<br>>> {
<br>>> static for(size_t i =3D 0; i < sizeof...(Types); i++=
) {
<br>>> f(get<i>(Tuple));
<br>>> }
<br>>> }
<br>>
<br>> Over on the Standard Discussion group under the "switch statements=
"
<br>> thread I mentioned some alternative approach, see
<br>> <a href=3D"https://groups.google.com/a/isocpp.org/d/msg/std-discus=
sion/q4KhZaN9IOY/wVukypfFJBEJ" target=3D"_blank">https://groups.google.com/=
a/<wbr>isocpp.org/d/msg/std-<wbr>discussion/q4KhZaN9IOY/<wbr>wVukypfFJBEJ</=
a>
<br>> which would only require the addition of pack literals or constant
<br>> integral pack expressions (or whatever these would be called).
<br>> for_each could then be implemented as:
<br>>
<br>> template<typename F, typename ... Types>
<br>> void for_each(tuple<Types...> Tuple, F f)
<br>> {
<br>> f(get<0 .. sizeof...(Types) - 1>(Tuple)) ...;
<br>> }
<br>>
<br>> or using slightly different syntax as:
<br>>
<br>> template<typename F, typename ... Types>
<br>> void for_each(tuple<Types...> Tuple, F f)
<br>> {
<br>> f(get<0 : sizeof...(Types)>(Tuple)) ...;
<br>> }
<br>>
<br>> Well, you would also need to allow a pack expansion in an
<br>> expression-statement (for this example), but the main idea would b=
e to
<br>> just add suitable syntax to write a range of integers as a pack (w=
hich
<br>> can then be expanded as usual). I believe this would be much easie=
r to
<br>> implement than static for and might fit in more naturally into the
<br>> existing variadic template support and can be used in contexts whe=
re
<br>> "static for" can't be used (initializer lists) - and I am sure it =
will
<br>> please those who argue for brevity in C++'s syntax...
<br>>
<br>> BTW, I am just thinking out loud here...
<br>>
<br>>
<br>> Christof
<br>>
<br>> --
<br>>
<br>> <a href=3D"http://cmeerw.org" target=3D"_blank">http://cmeerw.org<=
/a> &=
nbsp; sip:cmeerw at <a href=3D"http://cmeerw.org=
" target=3D"_blank">cmeerw.org</a>
<br>> mailto:<a>cmeerw</a> at <a href=3D"http://cmeerw.org" target=3D"_b=
lank">cmeerw.org</a>  =
; xmpp:cmeerw at <a href=3D"http://cmeerw.org" target=3D"_blank">cme=
erw.org</a>
<br>>
<br>> --
<br>>
<br>>
<br>>
<br></blockquote></blockquote>
<p></p>
-- <br />
<br />
<br />
<br />
------=_Part_30_21624569.1352996911845--
.
Author: DeadMG <wolfeinstein@gmail.com>
Date: Thu, 15 Nov 2012 10:31:45 -0800 (PST)
Raw View
------=_Part_249_22622719.1353004305916
Content-Type: text/plain; charset=ISO-8859-1
Whoah, whoah, slow down.
What you're really talking about is "constexpr functions, that can operate
on types". Now I'm all for this, but it's a big deal.
--
------=_Part_249_22622719.1353004305916
Content-Type: text/html; charset=ISO-8859-1
Whoah, whoah, slow down.<div><br></div><div>What you're really talking about is "constexpr functions, that can operate on types". Now I'm all for this, but it's a big deal.</div>
<p></p>
-- <br />
<br />
<br />
<br />
------=_Part_249_22622719.1353004305916--
.
Author: Christof Meerwald <cmeerw@cmeerw.org>
Date: Thu, 15 Nov 2012 21:09:44 +0100
Raw View
Hi Clayton,
On Thu, Nov 15, 2012 at 02:53:43AM -0500, Clayton Davis wrote:
> Christof: That's definitely an interesting proposal. Less flexible,
> in terms of what can be expressed there, but certainly more concise.
> (In terms of which fits more smoothly into the language -- well, if we
> assume static if is likely to become part of the language, then
> probably we're on different but similar footing. If static if isn't
> approved, then static for never had a chance anyway.)
I would claim that "static if" isn't actually that similar to "static
for" - "static if" seems to be more similar to "#if" than "if" as the
aim seems to be to achieve conditional compilation (via tokenization).
Whereas "static for" appears to focus on compile-time iteration for
(restricted) for loops.
> I'll admit the
> one thing that makes me uncomfortable is: right now parameter packs
> are basically free of semantics, just a comma-separated list in a
> sense. What you're suggesting starts to look like a compile-time
> constructor for a specific type of parameter pack. So, does it make
> sense to "create" a parameter pack?
I think the next step would be to define some kind of constexpr
generator function as a generalisation of the 1..n range-based pack
expression (so something that would generate a sequence of ints at
compile time). I just can't think of a nice way to define that
interface yet.
> Anyway, if we're heading in a
> direction where we can manipulate parameter packs in more ways, then
> I'd be more comfortable if they were genuine types with constructors
> and access functions. So, just to go wild (not a
> carefully-thought-out suggestion), imagine that parameter packs had a
> genuine type, and that type could be manipulated:
Hmm, I guess at some point they will become first-class citizens.
> template<typename F, typename ... Types>
> void for_each(tuple<Types...> Tuple, F f)
> {
> const pack LoopPack = {0 .. sizeof...(Types)-1};
Why not: int ... LoopPack = { 0 .. sizeof...(Types)-1 };
Would seem more natural to me - but only works for non-type packs.
> assert(typeid(LoopTuple) == typeid(Types));
> f(get<LoopPack>(Tuple)) ...;
> }
>
> I'm leaving the .. for producing a range, but just trying to separate
> out that feature from the question of how you can manipulate the range
> like a parameter pack by making that conversion explicit. The
> downside is that now two features are needed, but from my end I guess
> I'd suggest you keep them separate somehow. Since we're just talking
> out loud here :)
These should definitely be kept separate...
Christof
--
http://cmeerw.org sip:cmeerw at cmeerw.org
mailto:cmeerw at cmeerw.org xmpp:cmeerw at cmeerw.org
--
.
Author: Christof Meerwald <cmeerw@cmeerw.org>
Date: Thu, 15 Nov 2012 21:19:02 +0100
Raw View
On Thu, Nov 15, 2012 at 08:28:31AM -0800, Nicol Bolas wrote:
> static if is neat in part because it can do conditional compilation. It's
> not just something that goes in functions. You can have:
[...]
> static for has the potential to be something similar. Though it does
> require solving a problem:
I don't think "static for" should be similar to "static if" as "static
if" is mainly modelled after "#if" instead of "if".
> template<typename ...T>
> class Tuple
> {
> public:
> static for(i; 0; sizeof...(T); 1)
> {
> T[i] variable@i;
> }
Why not allow
T variable ...;
here instead - I think it would express the intent better.
> template<int i>
> T[i] &Get() {return variable@i;}
Yes, some kind of accessing by index would be nice.
Christof
--
http://cmeerw.org sip:cmeerw at cmeerw.org
mailto:cmeerw at cmeerw.org xmpp:cmeerw at cmeerw.org
--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Thu, 15 Nov 2012 12:23:47 -0800 (PST)
Raw View
------=_Part_140_32340542.1353011028005
Content-Type: text/plain; charset=ISO-8859-1
On Thursday, November 15, 2012 12:19:04 PM UTC-8, Christof Meerwald wrote:
>
> On Thu, Nov 15, 2012 at 08:28:31AM -0800, Nicol Bolas wrote:
> > static if is neat in part because it can do conditional compilation.
> It's
> > not just something that goes in functions. You can have:
> [...]
> > static for has the potential to be something similar. Though it does
> > require solving a problem:
>
> I don't think "static for" should be similar to "static if" as "static
> if" is mainly modelled after "#if" instead of "if".
>
> > template<typename ...T>
> > class Tuple
> > {
> > public:
> > static for(i; 0; sizeof...(T); 1)
> > {
> > T[i] variable@i;
> > }
>
> Why not allow
>
> T variable ...;
>
> here instead - I think it would express the intent better.
>
Because T is a template typename pack. How would the system know which type
in T we were referring to? Or which T at all, since it's very possible to
have multiple template packs in a template?
--
------=_Part_140_32340542.1353011028005
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
<br><br>On Thursday, November 15, 2012 12:19:04 PM UTC-8, Christof Meerwald=
wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.=
8ex;border-left: 1px #ccc solid;padding-left: 1ex;">On Thu, Nov 15, 2012 at=
08:28:31AM -0800, Nicol Bolas wrote:
<br>> static if is neat in part because it can do conditional compilatio=
n. It's=20
<br>> not just something that goes in functions. You can have:
<br>[...]
<br>> static for has the potential to be something similar. Though it do=
es=20
<br>> require solving a problem:
<br>
<br>I don't think "static for" should be similar to "static if" as "static
<br>if" is mainly modelled after "#if" instead of "if".
<br>
<br>> template<typename ...T>
<br>> class Tuple
<br>> {
<br>> public:
<br>> static for(i; 0; sizeof...(T); 1)
<br>> {
<br>> T[i] variable@i;
<br>> }
<br>
<br>Why not allow
<br>
<br> T variable ...;
<br>
<br>here instead - I think it would express the intent better.
<br></blockquote><div><br>Because T is a template typename pack. How would =
the system know which type in T we were referring to? Or which T at all, si=
nce it's very possible to have multiple template packs in a template? <br><=
/div><br>
<p></p>
-- <br />
<br />
<br />
<br />
------=_Part_140_32340542.1353011028005--
.
Author: Christof Meerwald <cmeerw@cmeerw.org>
Date: Thu, 15 Nov 2012 21:33:35 +0100
Raw View
On Thu, Nov 15, 2012 at 12:23:47PM -0800, Nicol Bolas wrote:
> On Thursday, November 15, 2012 12:19:04 PM UTC-8, Christof Meerwald wrote:
> > On Thu, Nov 15, 2012 at 08:28:31AM -0800, Nicol Bolas wrote:
> > > template<typename ...T>
> > > class Tuple
> > > {
> > > public:
> > > static for(i; 0; sizeof...(T); 1)
> > > {
> > > T[i] variable@i;
> > > }
> >
> > Why not allow
> >
> > T variable ...;
> >
> > here instead - I think it would express the intent better.
> >
> Because T is a template typename pack. How would the system know which type
> in T we were referring to? Or which T at all, since it's very possible to
> have multiple template packs in a template?
Well, T is a template type parameter pack that would be expanded in
this case and so you would have a member declaration for each element
type. I mean, is there a use case where you wouldn't want to expand
the whole pack? (and where you wouldn't handle that case via a partial
specialization)
Christof
--
http://cmeerw.org sip:cmeerw at cmeerw.org
mailto:cmeerw at cmeerw.org xmpp:cmeerw at cmeerw.org
--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Thu, 15 Nov 2012 13:27:14 -0800 (PST)
Raw View
------=_Part_819_27998586.1353014834758
Content-Type: text/plain; charset=ISO-8859-1
On Thursday, November 15, 2012 12:33:39 PM UTC-8, Christof Meerwald wrote:
>
> On Thu, Nov 15, 2012 at 12:23:47PM -0800, Nicol Bolas wrote:
> > On Thursday, November 15, 2012 12:19:04 PM UTC-8, Christof Meerwald
> wrote:
> > > On Thu, Nov 15, 2012 at 08:28:31AM -0800, Nicol Bolas wrote:
> > > > template<typename ...T>
> > > > class Tuple
> > > > {
> > > > public:
> > > > static for(i; 0; sizeof...(T); 1)
> > > > {
> > > > T[i] variable@i;
> > > > }
> > >
> > > Why not allow
> > >
> > > T variable ...;
> > >
> > > here instead - I think it would express the intent better.
> > >
> > Because T is a template typename pack. How would the system know which
> type
> > in T we were referring to? Or which T at all, since it's very possible
> to
> > have multiple template packs in a template?
>
> Well, T is a template type parameter pack that would be expanded in
> this case and so you would have a member declaration for each element
> type. I mean, is there a use case where you wouldn't want to expand
> the whole pack? (and where you wouldn't handle that case via a partial
> specialization)
>
I missed the ... part, but that just raises further questions.
What is `variable`? It's certainly not a *variable*, because it has no
type. Is this some kind of "variable definition pack"? How do you
initialize them in a constructor? How do you access them?
My way works by creating a specific identifier for each one.
--
------=_Part_819_27998586.1353014834758
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
<br><br>On Thursday, November 15, 2012 12:33:39 PM UTC-8, Christof Meerwald=
wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.=
8ex;border-left: 1px #ccc solid;padding-left: 1ex;">On Thu, Nov 15, 2012 at=
12:23:47PM -0800, Nicol Bolas wrote:
<br>> On Thursday, November 15, 2012 12:19:04 PM UTC-8, Christof Meerwal=
d wrote:
<br>> > On Thu, Nov 15, 2012 at 08:28:31AM -0800, Nicol Bolas wrote:=
=20
<br>> > > template<typename ...T>=20
<br>> > > class Tuple=20
<br>> > > {=20
<br>> > > public:=20
<br>> > > static for(i; 0; sizeof...(T); 1)=20
<br>> > > {=20
<br>> > > T[i] variable@i;=20
<br>> > > }=20
<br>> >
<br>> > Why not allow=20
<br>> >
<br>> > T variable ...;=20
<br>> >
<br>> > here instead - I think it would express the intent better.=20
<br>> >
<br>> Because T is a template typename pack. How would the system know w=
hich type=20
<br>> in T we were referring to? Or which T at all, since it's very poss=
ible to=20
<br>> have multiple template packs in a template?=20
<br>
<br>Well, T is a template type parameter pack that would be expanded in
<br>this case and so you would have a member declaration for each element
<br>type. I mean, is there a use case where you wouldn't want to expand
<br>the whole pack? (and where you wouldn't handle that case via a partial
<br>specialization)
<br></blockquote><div><br>I missed the ... part, but that just raises furth=
er questions.<br><br>What is `variable`? It's certainly not a <i>variable</=
i>, because it has no type. Is this some kind of "variable definition pack"=
? How do you initialize them in a constructor? How do you access them?<br><=
br>My way works by creating a specific identifier for each one.<br></div>
<p></p>
-- <br />
<br />
<br />
<br />
------=_Part_819_27998586.1353014834758--
.
Author: Christof Meerwald <cmeerw@cmeerw.org>
Date: Thu, 15 Nov 2012 22:50:45 +0100
Raw View
On Thu, Nov 15, 2012 at 01:27:14PM -0800, Nicol Bolas wrote:
> On Thursday, November 15, 2012 12:33:39 PM UTC-8, Christof Meerwald wrote:
> > On Thu, Nov 15, 2012 at 12:23:47PM -0800, Nicol Bolas wrote:
> > > On Thursday, November 15, 2012 12:19:04 PM UTC-8, Christof Meerwald
> > wrote:
> > > > On Thu, Nov 15, 2012 at 08:28:31AM -0800, Nicol Bolas wrote:
> > > > > template<typename ...T>
> > > > > class Tuple
> > > > > {
> > > > > public:
> > > > > static for(i; 0; sizeof...(T); 1)
> > > > > {
> > > > > T[i] variable@i;
> > > > > }
> > > >
> > > > Why not allow
> > > >
> > > > T variable ...;
> > > >
> > > > here instead - I think it would express the intent better.
> > > >
> > > Because T is a template typename pack. How would the system know which
> > type
> > > in T we were referring to? Or which T at all, since it's very possible
> > to
> > > have multiple template packs in a template?
> >
> > Well, T is a template type parameter pack that would be expanded in
> > this case and so you would have a member declaration for each element
> > type. I mean, is there a use case where you wouldn't want to expand
> > the whole pack? (and where you wouldn't handle that case via a partial
> > specialization)
> I missed the ... part, but that just raises further questions.
>
> What is `variable`? It's certainly not a *variable*, because it has no
> type. Is this some kind of "variable definition pack"?
Yes, "data member pack" maybe - btw, I am not sure if it should be "T ...
variable" or "T variable ..."
> How do you
> initialize them in a constructor? How do you access them?
Via pack expansions, e.g.
template<typename ...T>
struct Tuple
{
T variable ...;
Tuple(T ... t)
: variable(t) ...
{ }
};
Note that this syntax is already supported for base classes.
Access would also be via the usual pack expansions, though it would be
nice to have a way to access by a specific index as I mentioned
earlier (but that could be a separate feature).
> My way works by creating a specific identifier for each one.
Sure, but it doesn't really work together with the already existing
variadic template features.
Christof
--
http://cmeerw.org sip:cmeerw at cmeerw.org
mailto:cmeerw at cmeerw.org xmpp:cmeerw at cmeerw.org
--
.
Author: =?UTF-8?Q?Micha=C5=82_=22Griwes=22_Dominiak?= <griwes@griwes.info>
Date: Thu, 15 Nov 2012 22:54:03 +0100
Raw View
--f46d04447e617a160004ce8fb0f1
Content-Type: text/plain; charset=ISO-8859-1
Because if we would already get `variable@i` and `T[i]`, (I think that) it
would be far simpler to implement it that way (and just make the compiler
iterate over the pack; I think that there are much more use cases for
static for than just this one), instead of adding yet another meaning for
`...`. Also, you might want to skip some of those variables using static if
- or replace them with something else; consider
template <typename... T>
class SomeTupleClass
{
public:
static for (i; 0; sizeof...(T); 1)
{
static if (std::is_pointer<T>::value) // I haven't looked into
static if proposal yet, I might be wrong about the exact syntax here
{
std::unique_ptr<std::remove_pointer<T[i]>> variable@i;
}
else
{
T[i] variable@i;
}
}
};
Because we don't like raw pointers, do we?
On 15 November 2012 21:33, Christof Meerwald <cmeerw@cmeerw.org> wrote:
> On Thu, Nov 15, 2012 at 12:23:47PM -0800, Nicol Bolas wrote:
> > On Thursday, November 15, 2012 12:19:04 PM UTC-8, Christof Meerwald
> wrote:
> > > On Thu, Nov 15, 2012 at 08:28:31AM -0800, Nicol Bolas wrote:
> > > > template<typename ...T>
> > > > class Tuple
> > > > {
> > > > public:
> > > > static for(i; 0; sizeof...(T); 1)
> > > > {
> > > > T[i] variable@i;
> > > > }
> > >
> > > Why not allow
> > >
> > > T variable ...;
> > >
> > > here instead - I think it would express the intent better.
> > >
> > Because T is a template typename pack. How would the system know which
> type
> > in T we were referring to? Or which T at all, since it's very possible to
> > have multiple template packs in a template?
>
> Well, T is a template type parameter pack that would be expanded in
> this case and so you would have a member declaration for each element
> type. I mean, is there a use case where you wouldn't want to expand
> the whole pack? (and where you wouldn't handle that case via a partial
> specialization)
>
>
> Christof
>
> --
>
> http://cmeerw.org sip:cmeerw at cmeerw.org
> mailto:cmeerw at cmeerw.org xmpp:cmeerw at cmeerw.org
>
> --
>
>
>
>
--
--f46d04447e617a160004ce8fb0f1
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Because if we would already get `variable@i` and `T[i]`, (I think that) it =
would be far simpler to implement it that way (and just make the compiler i=
terate over the pack; I think that there are much more use cases for static=
for than just this one), instead of adding yet another meaning for `...`. =
Also, you might want to skip some of those variables using static if - or r=
eplace them with something else; consider<div>
<br></div><div>template <typename... T></div><div>class SomeTupleClas=
s</div><div>{</div><div>public:</div><div>=A0 =A0 static for (i; 0; sizeof.=
...(T); 1)</div><div>=A0 =A0 {</div><div>=A0 =A0 =A0 =A0 static if (std::is_=
pointer<T>::value) // I haven't looked into static if proposal ye=
t, I might be wrong about the exact syntax here</div>
<div>=A0 =A0 =A0 =A0 {</div><div>=A0 =A0 =A0 =A0 =A0 =A0 std::unique_ptr<=
;std::remove_pointer<T[i]>> variable@i;</div><div>=A0 =A0 =A0 =A0 =
}</div><div>=A0 =A0 =A0 =A0 else</div><div>=A0 =A0 =A0 =A0 {</div><div>=A0 =
=A0 =A0 =A0 =A0 =A0 T[i] variable@i;</div><div>=A0 =A0 =A0 =A0 }</div>
<div>=A0 =A0 }</div><div>};</div><div><br></div><div>Because we don't l=
ike raw pointers, do we?</div><div class=3D"gmail_extra"><br><br><div class=
=3D"gmail_quote">On 15 November 2012 21:33, Christof Meerwald <span dir=3D"=
ltr"><<a href=3D"mailto:cmeerw@cmeerw.org" target=3D"_blank">cmeerw@cmee=
rw.org</a>></span> wrote:<br>
<blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1p=
x #ccc solid;padding-left:1ex"><div class=3D"im">On Thu, Nov 15, 2012 at 12=
:23:47PM -0800, Nicol Bolas wrote:<br>
> On Thursday, November 15, 2012 12:19:04 PM UTC-8, Christof Meerwald wr=
ote:<br>
> > On Thu, Nov 15, 2012 at 08:28:31AM -0800, Nicol Bolas wrote:<br>
</div><div class=3D"im">> > > template<typename ...T><br>
> > > class Tuple<br>
> > > {<br>
> > > public:<br>
> > > =A0 static for(i; 0; sizeof...(T); 1)<br>
> > > =A0 {<br>
> > > =A0 =A0 T[i] variable@i;<br>
> > > =A0 }<br>
> ><br>
> > Why not allow<br>
> ><br>
> > =A0 T variable ...;<br>
> ><br>
> > here instead - I think it would express the intent better.<br>
> ><br>
> Because T is a template typename pack. How would the system know which=
type<br>
> in T we were referring to? Or which T at all, since it's very poss=
ible to<br>
> have multiple template packs in a template?<br>
<br>
</div>Well, T is a template type parameter pack that would be expanded in<b=
r>
this case and so you would have a member declaration for each element<br>
type. I mean, is there a use case where you wouldn't want to expand<br>
the whole pack? (and where you wouldn't handle that case via a partial<=
br>
specialization)<br>
<div class=3D"HOEnZb"><div class=3D"h5"><br>
<br>
Christof<br>
<br>
--<br>
<br>
<a href=3D"http://cmeerw.org" target=3D"_blank">http://cmeerw.org</a> =A0 =
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0sip:cmeerw at <a hre=
f=3D"http://cmeerw.org" target=3D"_blank">cmeerw.org</a><br>
mailto:<a href=3D"mailto:cmeerw">cmeerw</a> at <a href=3D"http://cmeerw.org=
" target=3D"_blank">cmeerw.org</a> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 xmpp=
:cmeerw at <a href=3D"http://cmeerw.org" target=3D"_blank">cmeerw.org</a><b=
r>
<br>
--<br>
<br>
<br>
<br>
</div></div></blockquote></div><br></div>
<p></p>
-- <br />
<br />
<br />
<br />
--f46d04447e617a160004ce8fb0f1--
.
Author: =?UTF-8?Q?Micha=C5=82_Dominiak?= <griwes@griwes.info>
Date: Thu, 15 Nov 2012 14:00:03 -0800 (PST)
Raw View
------=_Part_682_8711134.1353016803190
Content-Type: text/plain; charset=ISO-8859-1
And what if you wanted to do some crazy magic there, like making each
pointer type an unique_ptr? I cannot give clear use case for this one, but
I think it should be considered. It would be trivial with static for and
static if (just some is_pointer and remove_pointer), but how would you
handle it with this syntax making `...` being overused again?
Also, that constructor syntax you used could create strange ambiguities for
parser; wouldn't changing that into `variable...(t)` make more sense? I
mean, in the declaration, it looks like that member is called `variable...`
- why not keep that feel?
On Thursday, 15 November 2012 22:50:47 UTC+1, Christof Meerwald wrote:
>
> On Thu, Nov 15, 2012 at 01:27:14PM -0800, Nicol Bolas wrote:
> > On Thursday, November 15, 2012 12:33:39 PM UTC-8, Christof Meerwald
> wrote:
> > > On Thu, Nov 15, 2012 at 12:23:47PM -0800, Nicol Bolas wrote:
> > > > On Thursday, November 15, 2012 12:19:04 PM UTC-8, Christof Meerwald
> > > wrote:
> > > > > On Thu, Nov 15, 2012 at 08:28:31AM -0800, Nicol Bolas wrote:
> > > > > > template<typename ...T>
> > > > > > class Tuple
> > > > > > {
> > > > > > public:
> > > > > > static for(i; 0; sizeof...(T); 1)
> > > > > > {
> > > > > > T[i] variable@i;
> > > > > > }
> > > > >
> > > > > Why not allow
> > > > >
> > > > > T variable ...;
> > > > >
> > > > > here instead - I think it would express the intent better.
> > > > >
> > > > Because T is a template typename pack. How would the system know
> which
> > > type
> > > > in T we were referring to? Or which T at all, since it's very
> possible
> > > to
> > > > have multiple template packs in a template?
> > >
> > > Well, T is a template type parameter pack that would be expanded in
> > > this case and so you would have a member declaration for each element
> > > type. I mean, is there a use case where you wouldn't want to expand
> > > the whole pack? (and where you wouldn't handle that case via a partial
> > > specialization)
> > I missed the ... part, but that just raises further questions.
> >
> > What is `variable`? It's certainly not a *variable*, because it has no
> > type. Is this some kind of "variable definition pack"?
>
> Yes, "data member pack" maybe - btw, I am not sure if it should be "T ...
> variable" or "T variable ..."
>
> > How do you
> > initialize them in a constructor? How do you access them?
>
> Via pack expansions, e.g.
>
> template<typename ...T>
> struct Tuple
> {
> T variable ...;
>
> Tuple(T ... t)
> : variable(t) ...
> { }
> };
>
> Note that this syntax is already supported for base classes.
>
> Access would also be via the usual pack expansions, though it would be
> nice to have a way to access by a specific index as I mentioned
> earlier (but that could be a separate feature).
>
> > My way works by creating a specific identifier for each one.
>
> Sure, but it doesn't really work together with the already existing
> variadic template features.
>
>
> Christof
>
> --
>
> http://cmeerw.org sip:cmeerw at cmeerw.org
> mailto:cmeerw <javascript:> at cmeerw.org xmpp:cmeerw
> at cmeerw.org
>
--
------=_Part_682_8711134.1353016803190
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
And what if you wanted to do some crazy magic there, like making each point=
er type an unique_ptr? I cannot give clear use case for this one, but I thi=
nk it should be considered. It would be trivial with static for and static =
if (just some is_pointer and remove_pointer), but how would you handle it w=
ith this syntax making `...` being overused again?<div><br></div><div>Also,=
that constructor syntax you used could create strange ambiguities for pars=
er; wouldn't changing that into `variable...(t)` make more sense? I mean, i=
n the declaration, it looks like that member is called `variable...` - why =
not keep that feel?<br><div><br>On Thursday, 15 November 2012 22:50:47 UTC+=
1, Christof Meerwald wrote:<blockquote class=3D"gmail_quote" style=3D"marg=
in: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;">On=
Thu, Nov 15, 2012 at 01:27:14PM -0800, Nicol Bolas wrote:
<br>> On Thursday, November 15, 2012 12:33:39 PM UTC-8, Christof Meerwal=
d wrote:
<br>> > On Thu, Nov 15, 2012 at 12:23:47PM -0800, Nicol Bolas wrote:=
=20
<br>> > > On Thursday, November 15, 2012 12:19:04 PM UTC-8, Christ=
of Meerwald=20
<br>> > wrote:=20
<br>> > > > On Thu, Nov 15, 2012 at 08:28:31AM -0800, Nicol Bol=
as wrote:=20
<br>> > > > > template<typename ...T>=20
<br>> > > > > class Tuple=20
<br>> > > > > {=20
<br>> > > > > public:=20
<br>> > > > > static for(i; 0; sizeof...(T); 1)=20
<br>> > > > > {=20
<br>> > > > > T[i] variable@i;=20
<br>> > > > > }=20
<br>> > > >=20
<br>> > > > Why not allow=20
<br>> > > >=20
<br>> > > > T variable ...;=20
<br>> > > >=20
<br>> > > > here instead - I think it would express the intent =
better.=20
<br>> > > >=20
<br>> > > Because T is a template typename pack. How would the sys=
tem know which=20
<br>> > type=20
<br>> > > in T we were referring to? Or which T at all, since it's=
very possible=20
<br>> > to=20
<br>> > > have multiple template packs in a template?=20
<br>> >
<br>> > Well, T is a template type parameter pack that would be expan=
ded in=20
<br>> > this case and so you would have a member declaration for each=
element=20
<br>> > type. I mean, is there a use case where you wouldn't want to =
expand=20
<br>> > the whole pack? (and where you wouldn't handle that case via =
a partial=20
<br>> > specialization)=20
<br>> I missed the ... part, but that just raises further questions.
<br>>=20
<br>> What is `variable`? It's certainly not a *variable*, because it ha=
s no=20
<br>> type. Is this some kind of "variable definition pack"?
<br>
<br>Yes, "data member pack" maybe - btw, I am not sure if it should be "T .=
...
<br>variable" or "T variable ..."
<br>
<br>> How do you
<br>> initialize them in a constructor? How do you access them?
<br>
<br>Via pack expansions, e.g.
<br>
<br>template<typename ...T>=20
<br>struct Tuple=20
<br>{
<br> T variable ...;
<br>
<br> Tuple(T ... t)
<br> : variable(t) ...
<br> { }
<br>};
<br>
<br>Note that this syntax is already supported for base classes.
<br>
<br>Access would also be via the usual pack expansions, though it would be
<br>nice to have a way to access by a specific index as I mentioned
<br>earlier (but that could be a separate feature).
<br>
<br>> My way works by creating a specific identifier for each one.
<br>
<br>Sure, but it doesn't really work together with the already existing=20
<br>variadic template features.
<br>
<br>
<br>Christof
<br>
<br>--=20
<br>
<br><a href=3D"http://cmeerw.org" target=3D"_blank">http://cmeerw.org</a> &=
nbsp; =
sip:cmeerw at <a href=3D"http://cmeerw.org" tar=
get=3D"_blank">cmeerw.org</a>
<br>mailto:<a href=3D"javascript:" target=3D"_blank" gdf-obfuscated-mailto=
=3D"jhs9Bn5ztF4J">cmeerw</a> at <a href=3D"http://cmeerw.org" target=3D"_bl=
ank">cmeerw.org</a> =
xmpp:cmeerw at <a href=3D"http://cmeerw.org" target=3D"_blank">cmee=
rw.org</a>
<br></blockquote></div></div>
<p></p>
-- <br />
<br />
<br />
<br />
------=_Part_682_8711134.1353016803190--
.
Author: Richard Smith <richard@metafoo.co.uk>
Date: Thu, 15 Nov 2012 14:01:25 -0800
Raw View
On Thu, Nov 15, 2012 at 1:50 PM, Christof Meerwald <cmeerw@cmeerw.org> wrote:
> On Thu, Nov 15, 2012 at 01:27:14PM -0800, Nicol Bolas wrote:
>> On Thursday, November 15, 2012 12:33:39 PM UTC-8, Christof Meerwald wrote:
>> > On Thu, Nov 15, 2012 at 12:23:47PM -0800, Nicol Bolas wrote:
>> > > On Thursday, November 15, 2012 12:19:04 PM UTC-8, Christof Meerwald
>> > wrote:
>> > > > On Thu, Nov 15, 2012 at 08:28:31AM -0800, Nicol Bolas wrote:
>> > > > > template<typename ...T>
>> > > > > class Tuple
>> > > > > {
>> > > > > public:
>> > > > > static for(i; 0; sizeof...(T); 1)
>> > > > > {
>> > > > > T[i] variable@i;
>> > > > > }
>> > > >
>> > > > Why not allow
>> > > >
>> > > > T variable ...;
>> > > >
>> > > > here instead - I think it would express the intent better.
>> > > >
>> > > Because T is a template typename pack. How would the system know which
>> > type
>> > > in T we were referring to? Or which T at all, since it's very possible
>> > to
>> > > have multiple template packs in a template?
>> >
>> > Well, T is a template type parameter pack that would be expanded in
>> > this case and so you would have a member declaration for each element
>> > type. I mean, is there a use case where you wouldn't want to expand
>> > the whole pack? (and where you wouldn't handle that case via a partial
>> > specialization)
>> I missed the ... part, but that just raises further questions.
>>
>> What is `variable`? It's certainly not a *variable*, because it has no
>> type. Is this some kind of "variable definition pack"?
>
> Yes, "data member pack" maybe - btw, I am not sure if it should be "T ...
> variable" or "T variable ..."
It should be "T ...variable;". When declaring a pack, the ellipsis
always goes before the name of the pack (or before where the name
would have gone if the name is omitted).
This seems like a natural and obvious extension to the existing
facilities, although its value is reduced by the existence of
std::tuple.
--
.
Author: Christof Meerwald <cmeerw@cmeerw.org>
Date: Thu, 15 Nov 2012 23:06:36 +0100
Raw View
On Thu, Nov 15, 2012 at 02:01:25PM -0800, Richard Smith wrote:
> On Thu, Nov 15, 2012 at 1:50 PM, Christof Meerwald <cmeerw@cmeerw.org> wrote:
> > Yes, "data member pack" maybe - btw, I am not sure if it should be "T ...
> > variable" or "T variable ..."
> It should be "T ...variable;". When declaring a pack, the ellipsis
> always goes before the name of the pack (or before where the name
> would have gone if the name is omitted).
Thanks for the clarification - I agree.
Christof
--
http://cmeerw.org sip:cmeerw at cmeerw.org
mailto:cmeerw at cmeerw.org xmpp:cmeerw at cmeerw.org
--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Thu, 15 Nov 2012 14:11:24 -0800 (PST)
Raw View
------=_Part_773_18470231.1353017484724
Content-Type: text/plain; charset=ISO-8859-1
On Thursday, November 15, 2012 1:50:47 PM UTC-8, Christof Meerwald wrote:
>
> On Thu, Nov 15, 2012 at 01:27:14PM -0800, Nicol Bolas wrote:
> > On Thursday, November 15, 2012 12:33:39 PM UTC-8, Christof Meerwald
> wrote:
> > > On Thu, Nov 15, 2012 at 12:23:47PM -0800, Nicol Bolas wrote:
> > > > On Thursday, November 15, 2012 12:19:04 PM UTC-8, Christof Meerwald
> > > wrote:
> > > > > On Thu, Nov 15, 2012 at 08:28:31AM -0800, Nicol Bolas wrote:
> > > > > > template<typename ...T>
> > > > > > class Tuple
> > > > > > {
> > > > > > public:
> > > > > > static for(i; 0; sizeof...(T); 1)
> > > > > > {
> > > > > > T[i] variable@i;
> > > > > > }
> > > > >
> > > > > Why not allow
> > > > >
> > > > > T variable ...;
> > > > >
> > > > > here instead - I think it would express the intent better.
> > > > >
> > > > Because T is a template typename pack. How would the system know
> which
> > > type
> > > > in T we were referring to? Or which T at all, since it's very
> possible
> > > to
> > > > have multiple template packs in a template?
> > >
> > > Well, T is a template type parameter pack that would be expanded in
> > > this case and so you would have a member declaration for each element
> > > type. I mean, is there a use case where you wouldn't want to expand
> > > the whole pack? (and where you wouldn't handle that case via a partial
> > > specialization)
> > I missed the ... part, but that just raises further questions.
> >
> > What is `variable`? It's certainly not a *variable*, because it has no
> > type. Is this some kind of "variable definition pack"?
>
> Yes, "data member pack" maybe - btw, I am not sure if it should be "T ...
> variable" or "T variable ..."
>
> > How do you
> > initialize them in a constructor? How do you access them?
>
> Via pack expansions, e.g.
>
> template<typename ...T>
> struct Tuple
> {
> T variable ...;
>
> Tuple(T ... t)
> : variable(t) ...
> { }
> };
>
> Note that this syntax is already supported for base classes.
>
Something *like* that syntax is used for base classes, but there are
important differences. Namely that the base class version isn't trying to
unpack *two* packs at the same time. `variable` and `t` are separate packs;
what you're trying to do is unpack both of them, which is fairly
unprecidented.
> Access would also be via the usual pack expansions, though it would be
> nice to have a way to access by a specific index as I mentioned
> earlier (but that could be a separate feature).
>
> > My way works by creating a specific identifier for each one.
>
> Sure, but it doesn't really work together with the already existing
> variadic template features.
>
Yes. That's the point. It's explicitly written out, rather than hiding
behind packs that have restricted functionality. That way, you can talk
about a specific variable. You can even do specialized logic like this:
static for(i; 0; sizeof...(T); 1)
{
static if(std::is_convertible<T[i], int>::value)
{
int variable@i;
}
else
{
T[i] variable@i;
}
}
It's obviously a contrived example, but it shows the power of such
constructs.
--
------=_Part_773_18470231.1353017484724
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
<br><br>On Thursday, November 15, 2012 1:50:47 PM UTC-8, Christof Meerwald =
wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8=
ex;border-left: 1px #ccc solid;padding-left: 1ex;">On Thu, Nov 15, 2012 at =
01:27:14PM -0800, Nicol Bolas wrote:
<br>> On Thursday, November 15, 2012 12:33:39 PM UTC-8, Christof Meerwal=
d wrote:
<br>> > On Thu, Nov 15, 2012 at 12:23:47PM -0800, Nicol Bolas wrote:=
=20
<br>> > > On Thursday, November 15, 2012 12:19:04 PM UTC-8, Christ=
of Meerwald=20
<br>> > wrote:=20
<br>> > > > On Thu, Nov 15, 2012 at 08:28:31AM -0800, Nicol Bol=
as wrote:=20
<br>> > > > > template<typename ...T>=20
<br>> > > > > class Tuple=20
<br>> > > > > {=20
<br>> > > > > public:=20
<br>> > > > > static for(i; 0; sizeof...(T); 1)=20
<br>> > > > > {=20
<br>> > > > > T[i] variable@i;=20
<br>> > > > > }=20
<br>> > > >=20
<br>> > > > Why not allow=20
<br>> > > >=20
<br>> > > > T variable ...;=20
<br>> > > >=20
<br>> > > > here instead - I think it would express the intent =
better.=20
<br>> > > >=20
<br>> > > Because T is a template typename pack. How would the sys=
tem know which=20
<br>> > type=20
<br>> > > in T we were referring to? Or which T at all, since it's=
very possible=20
<br>> > to=20
<br>> > > have multiple template packs in a template?=20
<br>> >
<br>> > Well, T is a template type parameter pack that would be expan=
ded in=20
<br>> > this case and so you would have a member declaration for each=
element=20
<br>> > type. I mean, is there a use case where you wouldn't want to =
expand=20
<br>> > the whole pack? (and where you wouldn't handle that case via =
a partial=20
<br>> > specialization)=20
<br>> I missed the ... part, but that just raises further questions.
<br>>=20
<br>> What is `variable`? It's certainly not a *variable*, because it ha=
s no=20
<br>> type. Is this some kind of "variable definition pack"?
<br>
<br>Yes, "data member pack" maybe - btw, I am not sure if it should be "T .=
...
<br>variable" or "T variable ..."
<br>
<br>> How do you
<br>> initialize them in a constructor? How do you access them?
<br>
<br>Via pack expansions, e.g.
<br>
<br>template<typename ...T>=20
<br>struct Tuple=20
<br>{
<br> T variable ...;
<br>
<br> Tuple(T ... t)
<br> : variable(t) ...
<br> { }
<br>};
<br>
<br>Note that this syntax is already supported for base classes.<br></block=
quote><div><br>Something <i>like</i> that syntax is used for base classes, =
but there are important differences. Namely that the base class version isn=
't trying to unpack <i>two</i> packs at the same time. `variable` and `t` a=
re separate packs; what you're trying to do is unpack both of them, which i=
s fairly unprecidented.<br> </div><blockquote class=3D"gmail_quote" st=
yle=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-lef=
t: 1ex;">
Access would also be via the usual pack expansions, though it would be
<br>nice to have a way to access by a specific index as I mentioned
<br>earlier (but that could be a separate feature).
<br>
<br>> My way works by creating a specific identifier for each one.
<br>
<br>Sure, but it doesn't really work together with the already existing=20
<br>variadic template features.
<br></blockquote><div><br>Yes. That's the point. It's explicitly written ou=
t, rather than hiding behind packs that have restricted functionality. That=
way, you can talk about a specific variable. You can even do specialized l=
ogic like this:<br><div class=3D"prettyprint" style=3D"background-color: rg=
b(250, 250, 250); border-color: rgb(187, 187, 187); border-style: solid; bo=
rder-width: 1px; word-wrap: break-word;"><code class=3D"prettyprint"><div c=
lass=3D"subprettyprint"><span style=3D"color: #000;" class=3D"styled-by-pre=
ttify"> </span><span style=3D"color: #008;" class=3D"styled-by-pretti=
fy">static</span><span style=3D"color: #000;" class=3D"styled-by-prettify">=
</span><span style=3D"color: #008;" class=3D"styled-by-prettify">for</span=
><span style=3D"color: #660;" class=3D"styled-by-prettify">(</span><span st=
yle=3D"color: #000;" class=3D"styled-by-prettify">i</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: #066;" class=
=3D"styled-by-prettify">0</span><span style=3D"color: #660;" class=3D"style=
d-by-prettify">;</span><span style=3D"color: #000;" class=3D"styled-by-pret=
tify"> </span><span style=3D"color: #008;" class=3D"styled-by-prettify">siz=
eof</span><span style=3D"color: #660;" class=3D"styled-by-prettify">...(</s=
pan><span style=3D"color: #000;" class=3D"styled-by-prettify">T</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=
: #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"><br> </span><span style=3D"color: #660;" class=3D=
"styled-by-prettify">{</span><span style=3D"color: #000;" class=3D"styled-b=
y-prettify"><br> </span><span style=3D"color: #008;" class=3D"=
styled-by-prettify">static</span><span style=3D"color: #000;" class=3D"styl=
ed-by-prettify"> </span><span style=3D"color: #008;" class=3D"styled-by-pre=
ttify">if</span><span style=3D"color: #660;" class=3D"styled-by-prettify">(=
</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 st=
yle=3D"color: #000;" class=3D"styled-by-prettify">is_convertible</span><spa=
n style=3D"color: #660;" class=3D"styled-by-prettify"><</span><span styl=
e=3D"color: #000;" class=3D"styled-by-prettify">T</span><span style=3D"colo=
r: #660;" class=3D"styled-by-prettify">[</span><span style=3D"color: #000;"=
class=3D"styled-by-prettify">i</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: #008;" class=3D"styled-by-pretti=
fy">int</span><span style=3D"color: #660;" class=3D"styled-by-prettify">>=
;::</span><span style=3D"color: #000;" class=3D"styled-by-prettify">value</=
span><span style=3D"color: #660;" class=3D"styled-by-prettify">)</span><spa=
n style=3D"color: #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> &nbs=
p; </span><span style=3D"color: #008;" class=3D"styled-by-prettify">int</sp=
an><span style=3D"color: #000;" class=3D"styled-by-prettify"> variable@i</s=
pan><span style=3D"color: #660;" class=3D"styled-by-prettify">;</span><span=
style=3D"color: #000;" class=3D"styled-by-prettify"><br> </sp=
an><span style=3D"color: #660;" class=3D"styled-by-prettify">}</span><span =
style=3D"color: #000;" class=3D"styled-by-prettify"><br> </spa=
n><span style=3D"color: #008;" class=3D"styled-by-prettify">else</span><spa=
n style=3D"color: #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> &nbs=
p; T</span><span style=3D"color: #660;" class=3D"styled-by-prettify">[</spa=
n><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"c=
olor: #000;" class=3D"styled-by-prettify"> variable@i</span><span style=3D"=
color: #660;" class=3D"styled-by-prettify">;</span><span style=3D"color: #0=
00;" 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"color: #6=
60;" class=3D"styled-by-prettify">}</span></div></code></div></div><br>It's=
obviously a contrived example, but it shows the power of such constructs.<=
br>
<p></p>
-- <br />
<br />
<br />
<br />
------=_Part_773_18470231.1353017484724--
.
Author: Christof Meerwald <cmeerw@cmeerw.org>
Date: Thu, 15 Nov 2012 23:13:51 +0100
Raw View
On Thu, Nov 15, 2012 at 02:00:03PM -0800, Micha=B3 Dominiak wrote:
> And what if you wanted to do some crazy magic there, like making each=20
> pointer type an unique_ptr? I cannot give clear use case for this one, bu=
t=20
> I think it should be considered. It would be trivial with static for and=
=20
> static if (just some is_pointer and remove_pointer), but how would you=20
> handle it with this syntax making `...` being overused again?
But that's easily done with already existing techniques:
template<typename T>
struct TypeCvt
{ typedef T type; };
template<typename T>
struct TypeCvt<T *>
{ typedef std::unique_ptr<T> type; };
template<typename ... T>
struct A
{
typename TypeCvt<T>::type ... var;
};
=20
> Also, that constructor syntax you used could create strange ambiguities f=
or=20
> parser; wouldn't changing that into `variable...(t)` make more sense? I=
=20
> mean, in the declaration, it looks like that member is called `variable..=
..`=20
> - why not keep that feel?
You need to expand both variable and t, therefore the expansion needs
to be for the whole mem-initializer - but this is exactly the same as
with base classes.
And as Richard pointed out, it should have been "T ... variable" in
the member declaration.
Christof
--=20
http://cmeerw.org sip:cmeerw at cmeerw.org
mailto:cmeerw at cmeerw.org xmpp:cmeerw at cmeerw.org
--=20
.
Author: Christof Meerwald <cmeerw@cmeerw.org>
Date: Thu, 15 Nov 2012 23:23:16 +0100
Raw View
On Thu, Nov 15, 2012 at 02:11:24PM -0800, Nicol Bolas wrote:
> On Thursday, November 15, 2012 1:50:47 PM UTC-8, Christof Meerwald wrote:
> > Via pack expansions, e.g.
> >
> > template<typename ...T>
> > struct Tuple
> > {
> > T variable ...;
> >
> > Tuple(T ... t)
> > : variable(t) ...
> > { }
> > };
> >
> > Note that this syntax is already supported for base classes.
> Something *like* that syntax is used for base classes, but there are
> important differences. Namely that the base class version isn't trying to
> unpack *two* packs at the same time. `variable` and `t` are separate packs;
> what you're trying to do is unpack both of them, which is fairly
> unprecidented.
I am going to disagree here:
template<typename ... T>
struct A : T ...
{
A(T ... t)
: T (t) ...
{ }
};
This also expands the base class pack T and the function parameter
pack t - I don't see any relevant difference and this is currently
supported in C++11.
BTW, also have a look at the example in 14.5.3/p5 in the standard for
some more fun...
Christof
--
http://cmeerw.org sip:cmeerw at cmeerw.org
mailto:cmeerw at cmeerw.org xmpp:cmeerw at cmeerw.org
--
.
Author: "Matt D." <matdzb@gmail.com>
Date: Tue, 18 Dec 2012 18:42:44 +0100
Raw View
This is a multi-part message in MIME format.
--------------040308040806030902010601
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
On 11/15/2012 19:47, Matt D. wrote:
>
> On Sunday, November 11, 2012 9:31:01 PM UTC+1, Clayto...@gmail.com wrote:
>
> Hi All,
>
> I'd like to make a proposal that is complementary to N3329 (static
> if; available at
> http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3329.pdf
> <http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3329.pdf>),
> which is currently under consideration. I believe there is a
> strong case to be made that static iteration loops would fit
> nicely alongside static if. A draft proposal is attached (Static
> Loops.pdf). In brief, though, the goal is to provide an
> alternative to template recursion that more closely models the
> runtime language, but forces loop unrolling during translation.
> For example, the following function would do something like
> boost.fusion's for_each:
>
> template<typename F, typename ... Types>
> void for_each(tuple<Types...> Tuple, F f)
> {
> static for(size_t i = 0; i < sizeof...(Types); i++) {
> f(get<i>(Tuple));
> }
> }
>
> The "static for" tells the compiler to unroll the for loop during
> translation. Then, get<i> can be instantiated separately for each
> iteration. The challenge to the proposal, which I've tried to
> address, is detecting when a loop can be unrolled in this fashion.
>
> I would be grateful for people's comments!
>
>
> Hi!
>
> Certainly looks interesting!
>
> Incidentally, this topic was briefly touched upon in this year's C++
> and Beyond discussion ("Alexandrescu, Meyers, Sutter: On Static If,
> C++11 in 2012, Modern Libraries, and Metaprogramming"), here:
> http://channel9.msdn.com/Shows/Going+Deep/Alexandrescu-Meyers-Sutter-On-Static-If-C11-in-2012-Modern-Libraries-and-Metaprogramming
> If you'd like to expand on the motivation/rationale aspect, feel free
> to re-use references /* shameless plug ;-) */:
> http://channel9.msdn.com/Forums/TechOff/Andrei-Herb-and-Scott-Got-C11-Questions/6947394a1f5845f18c7aa0a2015f6972
>
For additional / motivational example use cases, see also:
- static foreach / make unrolled loops easy to write, pg 52/57:
http://s3.amazonaws.com/dconf2007/WalterAndrei.pdf
- compile-time fold:
http://www.mail-archive.com/digitalmars-d@puremagic.com/msg28138.html
- Section 19.1, "Evaluation at Compile-Time", in the following:
https://raw.github.com/PhilippeSigaud/D-templates-tutorial/master/dtemplates.pdf
Best,
Matt
--
--------------040308040806030902010601
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
<html>
<head>
<meta content=3D"text/html; charset=3DISO-8859-1"
http-equiv=3D"Content-Type">
</head>
<body text=3D"#000000" bgcolor=3D"#FFFFFF">
<div class=3D"moz-cite-prefix">On 11/15/2012 19:47, Matt D. wrote:<br>
</div>
<blockquote
cite=3D"mid:c614603b-215f-495f-84b3-9629b1a878c1@isocpp.org"
type=3D"cite"><br>
On Sunday, November 11, 2012 9:31:01 PM UTC+1, <a class=3D"moz-txt-li=
nk-abbreviated" href=3D"mailto:Clayto...@gmail.com">Clayto...@gmail.com</a>
wrote:
<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left:
0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;">Hi All,<br>
<br>
I'd like to make a proposal that is complementary to N3329
(static if; available at <a moz-do-not-send=3D"true"
href=3D"http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n=
3329.pdf"
target=3D"_blank">http://www.open-std.org/jtc1/<wbr>sc22/wg21/doc=
s/papers/2012/<wbr>n3329.pdf</a>),
which is currently under consideration. I believe there is a
strong case to be made that static iteration loops would fit
nicely alongside static if. A draft proposal is attached
(Static Loops.pdf). In brief, though, the goal is to provide =
an
alternative to template recursion that more closely models the
runtime language, but forces loop unrolling during translation.&nbs=
p;
For example, the following function would do something like
boost.fusion's for_each:<br>
<br>
template<typename F, typename ... Types><br>
void for_each(tuple<Types...> Tuple, F f)<br>
{<br>
static for(size_t i =3D 0; i < sizeof...(Types); i++) {<b=
r>
f(get<i>(Tuple));<br>
}<br>
}<br>
<br>
The "static for" tells the compiler to unroll the for loop
during translation. Then, get<i> can be instantiated
separately for each iteration. The challenge to the proposal,
which I've tried to address, is detecting when a loop can be
unrolled in this fashion.<br>
<br>
I would be grateful for people's comments!<br>
</blockquote>
<div><br>
Hi!<br>
<br>
Certainly looks interesting!<br>
<br>
Incidentally, this topic was briefly touched upon in this year's
C++ and Beyond discussion ("Alexandrescu, Meyers, Sutter: On
Static If, C++11 in 2012, Modern Libraries, and
Metaprogramming"), here:<br>
<a class=3D"moz-txt-link-freetext" href=3D"http://channel9.msdn.com/Shows/G=
oing+Deep/Alexandrescu-Meyers-Sutter-On-Static-If-C11-in-2012-Modern-Librar=
ies-and-Metaprogramming">http://channel9.msdn.com/Shows/Going+Deep/Alexandr=
escu-Meyers-Sutter-On-Static-If-C11-in-2012-Modern-Libraries-and-Metaprogra=
mming</a><br>
If you'd like to expand on the motivation/rationale aspect, feel
free to re-use references /* shameless plug ;-) */:<br>
<a class=3D"moz-txt-link-freetext" href=3D"http://channel9.msdn.com/Forums/=
TechOff/Andrei-Herb-and-Scott-Got-C11-Questions/6947394a1f5845f18c7aa0a2015=
f6972">http://channel9.msdn.com/Forums/TechOff/Andrei-Herb-and-Scott-Got-C1=
1-Questions/6947394a1f5845f18c7aa0a2015f6972</a><br>
<br>
</div>
</blockquote>
For additional / motivational example use cases, see also:<br>
- static foreach / make unrolled loops easy to write, pg 52/57:<br>
<a class=3D"moz-txt-link-freetext" href=3D"http://s3.amazonaws.com/dcon=
f2007/WalterAndrei.pdf">http://s3.amazonaws.com/dconf2007/WalterAndrei.pdf<=
/a><br>
- compile-time fold:<br>
<a class=3D"moz-txt-link-freetext" href=3D"http://www.mail-archive.com/digi=
talmars-d@puremagic.com/msg28138.html">http://www.mail-archive.com/digitalm=
ars-d@puremagic.com/msg28138.html</a><br>
- Section 19.1, "Evaluation at Compile-Time", in the following:<br>
<a class=3D"moz-txt-link-freetext" href=3D"https://raw.github.com/PhilippeS=
igaud/D-templates-tutorial/master/dtemplates.pdf">https://raw.github.com/Ph=
ilippeSigaud/D-templates-tutorial/master/dtemplates.pdf</a><br>
<br>
Best,<br>
<br>
Matt<br>
<br>
</body>
</html>
<p></p>
-- <br />
<br />
<br />
<br />
--------------040308040806030902010601--
.