<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[LUT zu Compilezeit generieren lassen]]></title><description><![CDATA[<p>Ich brauche eine Look-Up-Table, deren Größe von eine Compilezeit-Konstanten abhängig ist. Die einzelnen Elemente kann ich mit einem TMP-Konstrukt generieren. Wie bekomme ich das Ganze jedoch zusammen? Kann ich irgendwie ein Array zur Compilezeit mit den TMP-Generierten Werten füllen lassen?</p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/326715/lut-zu-compilezeit-generieren-lassen</link><generator>RSS for Node</generator><lastBuildDate>Sat, 30 May 2026 18:47:19 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/326715.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 03 Jul 2014 12:09:34 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to LUT zu Compilezeit generieren lassen on Thu, 03 Jul 2014 12:09:34 GMT]]></title><description><![CDATA[<p>Ich brauche eine Look-Up-Table, deren Größe von eine Compilezeit-Konstanten abhängig ist. Die einzelnen Elemente kann ich mit einem TMP-Konstrukt generieren. Wie bekomme ich das Ganze jedoch zusammen? Kann ich irgendwie ein Array zur Compilezeit mit den TMP-Generierten Werten füllen lassen?</p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2406836</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2406836</guid><dc:creator><![CDATA[LUTher]]></dc:creator><pubDate>Thu, 03 Jul 2014 12:09:34 GMT</pubDate></item><item><title><![CDATA[Reply to LUT zu Compilezeit generieren lassen on Thu, 03 Jul 2014 12:23:28 GMT]]></title><description><![CDATA[<blockquote>
<p>Kann ich irgendwie ein Array zur Compilezeit mit den TMP-Generierten Werten füllen lassen?</p>
</blockquote>
<p>Definitiv. Zeig einfach mal dein Konstrukt zur Generierung. Ist es rekursiv? Oder mit einem Index? Beides gut machbar.</p>
<p>Edit: Welchen Sprachstandard verwendest du? C++11 waere gut.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2406840</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2406840</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Thu, 03 Jul 2014 12:23:28 GMT</pubDate></item><item><title><![CDATA[Reply to LUT zu Compilezeit generieren lassen on Thu, 03 Jul 2014 12:25:18 GMT]]></title><description><![CDATA[<p>Ja, z.B. <a href="http://www.c-plusplus.net/forum/p2278668#2278668" rel="nofollow">so</a>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2406841</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2406841</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 03 Jul 2014 12:25:18 GMT</pubDate></item><item><title><![CDATA[Reply to LUT zu Compilezeit generieren lassen on Thu, 03 Jul 2014 12:29:10 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Ja, z.B. <a href="http://www.c-plusplus.net/forum/p2278668#2278668" rel="nofollow">so</a>.</p>
</blockquote>
<p>Da passiert ueberhaupt nichts zur <strong>Compile</strong>zeit, oder? Ich dachte, er will ein <code>constexpr</code> -Array?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2406843</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2406843</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Thu, 03 Jul 2014 12:29:10 GMT</pubDate></item><item><title><![CDATA[Reply to LUT zu Compilezeit generieren lassen on Thu, 03 Jul 2014 12:34:00 GMT]]></title><description><![CDATA[<p>Hi Arcoth. Der Generator selbst errechnet sich die Werte rekursiv, jedoch sind die einzelnen LUT-Werte voneinander unabhängig generierbar (also mit Index). Das soll in C++03 laufen. Mein Code:</p>
<pre><code>template&lt;std::size_t base, std::size_t exp&gt;
struct tmp_pow
{
	static const std::size_t value = base * tmp_pow&lt;base, exp - 1&gt;::value;
};
template&lt;std::size_t base&gt;
struct tmp_pow&lt;base, 0&gt;
{
	static const std::size_t value = 1;
};

template&lt;unsigned char val&gt;
struct gen
{
	static const std::size_t value = (val &amp; 1) + gen&lt;(val &gt;&gt; 1)&gt;::value;
};
template&lt;&gt;
struct gen&lt;0&gt;
{
	static const std::size_t value = 0;
};

std::size_t f(unsigned char val)
{
	static const std::size_t lut[tmp_pow&lt;2, std::numeric_limits&lt;unsigned char&gt;::digits&gt;::value] = ?;
	return lut[val];
}
</code></pre>
<p>Hier soll nun <code>lut[0] = gen&lt;0&gt;::value</code> , <code>lut[1] = gen&lt;1&gt;::value</code> , etc. sein. Wenn ich ein <code>static const</code> -Array habe und es mit Compilezeit-Konstanten fülle, dann dürfte der Compiler das direkt so in den Programmspeicher kopieren, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2406844</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2406844</guid><dc:creator><![CDATA[LUTher]]></dc:creator><pubDate>Thu, 03 Jul 2014 12:34:00 GMT</pubDate></item><item><title><![CDATA[Reply to LUT zu Compilezeit generieren lassen on Thu, 03 Jul 2014 12:53:03 GMT]]></title><description><![CDATA[<pre><code>tmp_pow&lt;2, std::numeric_limits&lt;unsigned char&gt;::digits&gt;::value&gt;
</code></pre>
<p>Nein, nein, nein!</p>
<pre><code>1 &lt;&lt; CHAR_BIT // Edit: Lieber CHAR_BIT
</code></pre>
<p>(Warum nicht einfach gleich <code>256</code> ...)</p>
<p>So, und dein Problem laesst sich relativ einfach loesen; und zwar mittels binaer rekursiver Makros.</p>
<p>Mit Boost.Preprocessor wird es einfacher und schoener (hast du Zugang dazu?), aber probier erstmal sowas:</p>
<pre><code>#define OP ( v ) (v &amp; 1) + gen&lt;(val &gt;&gt; 1)&gt;::value
#define OP2( v ) OP(v), OP(v+1)
#define OP4( v ) OP2(v), OP2(v+2)
#define OP8( v ) OP4(v), OP4(v+4)
#define OP16( v ) OP8(v), OP8(v+8)
#define OP32( v ) OP16(v), OP16(v+16)
#define OP64( v ) OP32(v), OP32(v+32)
#define OP128( v ) OP64(v), OP64(v+64)
#define OP256( v ) OP128(v), OP128(v+128)

static const std::size_t lut[] = { OP256(0) };
</code></pre>
<p>Ich bin gerade in der Schule und kann dir daher leider nicht zu viel testen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2406847</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2406847</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Thu, 03 Jul 2014 12:53:03 GMT</pubDate></item><item><title><![CDATA[Reply to LUT zu Compilezeit generieren lassen on Thu, 03 Jul 2014 12:56:31 GMT]]></title><description><![CDATA[<p>Ja schon, ich hätte auch ein Programm schreiben können dass mir den Code für die 256 Werte generiert. Ich frage jedoch ob das portabel geht da ja nicht jede Maschine 8 Bits pro Byte hat (daher auch die Limits statt 256). Geht das?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2406850</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2406850</guid><dc:creator><![CDATA[LUTher]]></dc:creator><pubDate>Thu, 03 Jul 2014 12:56:31 GMT</pubDate></item><item><title><![CDATA[Reply to LUT zu Compilezeit generieren lassen on Thu, 03 Jul 2014 12:57:45 GMT]]></title><description><![CDATA[<p>Variadic Templates helfen hier. Die mAn wichtigste Einsicht hierbei ist, dass sich praktisch alle anfallenden Probleme leicht lösen lassen, sofern man sie in Abhängigkeit einer Sequenz 0,1,2,...,N mit beliebigem N formulieren kann. Diese Sequenz kann leicht als Templateargumentliste erzeugt werden (in C++1y schon fertig als std::integer_sequence und std::make_integer_sequence in &lt;utility&gt;)</p>
<pre><code class="language-cpp">template &lt;typename T, T... I&gt;
struct integer_sequence {
    using value_type = T;
    static constexpr std::size_t size() noexcept { return sizeof...(I); }
};

template &lt;typename T, T N, T... I&gt;
struct make_integer_sequence_impl : make_integer_sequence_impl&lt;T, N-1, 0, 1+I...&gt; {};

template &lt;typename T, T... I&gt;
struct make_integer_sequence_impl&lt;T, 0, I...&gt;
{
    using type = integer_sequence&lt;T, I...&gt;;
};

template&lt;class T, T N&gt;
using make_integer_sequence = typename make_integer_sequence_impl&lt;T, N&gt;::type;

///////////////////////////////////////////
...

template &lt;std::size_t... I&gt;
std::size_t f(unsigned char val, std::integer_sequence&lt;std::size_t, I...&gt;)
{
    static const std::size_t lut[] = { gen&lt;I&gt;::value... };
    return lut[val];
}

std::size_t f(unsigned char val)
{
    return f(val, make_integer_sequence&lt;std::size_t, tmp_pow&lt;2, std::numeric_limits&lt;unsigned char&gt;::digits&gt;::value&gt;{});
}
</code></pre>
<p>(ungetestet, wahrscheinlich Schreibfehler drin).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2406851</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2406851</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 03 Jul 2014 12:57:45 GMT</pubDate></item><item><title><![CDATA[Reply to LUT zu Compilezeit generieren lassen on Thu, 03 Jul 2014 12:58:28 GMT]]></title><description><![CDATA[<blockquote>
<p>Geht das?</p>
</blockquote>
<p>Warum nicht einfach die ersten 2048 Werte mit obiger Methode generieren und dann nur die ersten paar nutzen die du brauchst?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2406852</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2406852</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Thu, 03 Jul 2014 12:58:28 GMT</pubDate></item><item><title><![CDATA[Reply to LUT zu Compilezeit generieren lassen on Thu, 03 Jul 2014 12:59:18 GMT]]></title><description><![CDATA[<blockquote>
<p>Variadic Templates helfen hier.</p>
</blockquote>
<p>Und sind voellig fehl am Platz. Der TE braucht C++<strong>03</strong>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2406853</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2406853</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Thu, 03 Jul 2014 12:59:18 GMT</pubDate></item><item><title><![CDATA[Reply to LUT zu Compilezeit generieren lassen on Thu, 03 Jul 2014 13:04:34 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<blockquote>
<p>Geht das?</p>
</blockquote>
<p>Warum nicht einfach die ersten 2048 Werte mit obiger Methode generieren und dann nur die ersten paar nutzen die du brauchst?</p>
</blockquote>
<p>Das ist doch immer noch nicht portabel. Was wenn die Maschine 16-Bit-Bytes hat? Es wäre mir ab liebsten, wenn der Code komplett unabhängig von der Plattform ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2406855</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2406855</guid><dc:creator><![CDATA[LUTher]]></dc:creator><pubDate>Thu, 03 Jul 2014 13:04:34 GMT</pubDate></item><item><title><![CDATA[Reply to LUT zu Compilezeit generieren lassen on Thu, 03 Jul 2014 13:42:14 GMT]]></title><description><![CDATA[<p>LUTher schrieb:</p>
<blockquote>
<p>Arcoth schrieb:</p>
<blockquote>
<blockquote>
<p>Geht das?</p>
</blockquote>
<p>Warum nicht einfach die ersten 2048 Werte mit obiger Methode generieren und dann nur die ersten paar nutzen die du brauchst?</p>
</blockquote>
<p>Das ist doch immer noch nicht portabel. Was wenn die Maschine 16-Bit-Bytes hat? Es wäre mir ab liebsten, wenn der Code komplett unabhängig von der Plattform ist.</p>
</blockquote>
<p>Das wird nichts mit C++03, sofern der Code auch noch einigermaßen standardkonform sein soll (man könnte theoretisch mit boost::tuple oder std::tr1::tuple etwas nicht ganz Konformes bauen - allerings mit nicht vertretbarer Performance). Für so etwas sind dann eben Codegeneratoren zuständig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2406862</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2406862</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 03 Jul 2014 13:42:14 GMT</pubDate></item><item><title><![CDATA[Reply to LUT zu Compilezeit generieren lassen on Thu, 03 Jul 2014 14:06:15 GMT]]></title><description><![CDATA[<blockquote>
<p>Das wird nichts mit C++03, sofern der Code auch noch einigermaßen standardkonform sein soll (man könnte theoretisch mit boost::tuple oder std::tr1::tuple etwas nicht ganz Konformes bauen - allerings mit nicht vertretbarer Performance). Für so etwas sind dann eben Codegeneratoren zuständig.</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /><br />
MPL versagt auch, oder? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Ich schlage dann vor</p>
<pre><code>#define OP( v ) gen&lt;v&gt;::value
#define OP2( v ) OP(v), OP(v+1)
#define OP4( v ) OP2(v), OP2(v+2)
#define OP8( v ) OP4(v), OP4(v+4)
#define OP16( v ) OP8(v), OP8(v+8)
#define OP32( v ) OP16(v), OP16(v+16)
#define OP64( v ) OP32(v), OP32(v+32)
#define OP128( v ) OP64(v), OP64(v+64)
#define OP256( v ) OP128(v), OP128(v+128)
#define OP512( v ) OP256(v), OP256(v+256)
#define OP1024( v ) OP512(v), OP512(v+512)
#define OP2048( v ) OP1024(v), OP1024(v+1024)
#define OP4096( v ) OP2048(v), OP2048(v+2048)
#define OP8192( v ) OP4096(v), OP4096(v+4096)
#define OP16384( v ) OP8192(v), OP8192(v+8192)
#define OP32768( v ) OP16384(v), OP16384(v+16384)
#define OP65536( v ) OP32768(v), OP32768(v+32768)

#define CONCAT_(a, b) a##b
#define CONCAT(a, b) CONCAT_(a, b)

#define POW28 256
#define POW29 512
#define POW210 1024
#define POW211 2048
#define POW212 4096
#define POW213 8192
#define POW214 16384
#define POW215 32768
#define POW216 65536

#include &lt;climits&gt;
#include &lt;cstddef&gt;

template&lt;unsigned char val&gt;
struct gen
{
	static const std::size_t value = (val &amp; 1) + gen&lt;(val &gt;&gt; 1)&gt;::value;
};
template&lt;&gt;
struct gen&lt;0&gt;
{
	static const std::size_t value = 0;
};

static const std::size_t lut[] = { CONCAT(OP, CONCAT(POW2, CHAR_BIT))(0) }; // Concat mit CHAR_MAX klappt nicht, da Hexadezimal
</code></pre>
<p>P.S.: Vielleicht kannste statt dem Initializer im Primärtemplate von gen einfach <code>__builtin_popcount</code> verwenden? Ist eine intrinsic und dürfte <strong>deutlich</strong> schneller kompilieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2406865</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2406865</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Thu, 03 Jul 2014 14:06:15 GMT</pubDate></item><item><title><![CDATA[Reply to LUT zu Compilezeit generieren lassen on Thu, 03 Jul 2014 14:06:20 GMT]]></title><description><![CDATA[<p>Welche CPU/Maschine der letzten 30 Jahre hatte keine 8bit Bytes?</p>
<p>Egal welchen Code ich hier im Thread betrachte. Keiner davon ist auch nur im Ansatz so wartbar wie eine zur Laufzeit mit einer einfachen Schleife erstellte Tabelle.</p>
<p>Und wenn der Code so portabel sein soll, dass er mal auf einer Maschine vernuenftig laeuft deren Byte nicht aus 8 bits besteht ist eine Laufzeittabelle ohnehin besser.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2406867</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2406867</guid><dc:creator><![CDATA[welcher]]></dc:creator><pubDate>Thu, 03 Jul 2014 14:06:20 GMT</pubDate></item><item><title><![CDATA[Reply to LUT zu Compilezeit generieren lassen on Thu, 03 Jul 2014 14:17:43 GMT]]></title><description><![CDATA[<blockquote>
<p>Welche CPU/Maschine der letzten 30 Jahre hatte keine 8bit Bytes?</p>
</blockquote>
<p>C54x DSPs. Gibt auch noch ältere Maschinen mit 9-Bit <code>char</code> s die IIRC momentan im Betrieb sind. Google hilft!</p>
<blockquote>
<p>Egal welchen Code ich hier im Thread betrachte. Keiner davon ist auch nur im Ansatz so wartbar wie eine zur Laufzeit mit einer einfachen Schleife erstellte Tabelle.</p>
</blockquote>
<p>Der Code den camper gezeigt hat ist definitiv wartbar*.<br />
Nur vielleicht ein wenig komplizierter zu verstehen, aber sobald man mit variadic templates vertraut ist, sollte das verständlich werden.</p>
<p>* und dank linearer Rekursion ineffizient, genau wie die meisten stdlib-Implementierungen, u.a. beim GCC. Hat nämlich superlineare Lauf(Compilier)zeitkomplexität.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2406868</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2406868</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Thu, 03 Jul 2014 14:17:43 GMT</pubDate></item><item><title><![CDATA[Reply to LUT zu Compilezeit generieren lassen on Thu, 03 Jul 2014 14:37:49 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<p>Der Code den camper gezeigt hat ist definitiv wartbar*.<br />
Nur vielleicht ein wenig komplizierter zu verstehen, aber sobald man mit variadic templates vertraut ist, sollte das verständlich werden.</p>
<p>* und dank linearer Rekursion ineffizient, genau wie die meisten stdlib-Implementierungen, u.a. beim GCC. Hat nämlich superlineare Lauf(Compilier)zeitkomplexität.</p>
</blockquote>
<p>Wahrscheinlich ist er sogar falsch, partielle Spezialisierung auf einen T-Parameter, dessen Typ selbst deduziert werden muss, geht ja nicht. Die simple Variante habe ich hier für dem Verständnis förderlich gehalten. Für eine std-Implementierung erwarte ich etwas bessers.</p>
<p>korrigiert könnte es z.B. so aussehen</p>
<pre><code class="language-cpp">template &lt;typename T&gt; struct identity { using type = T; };

template &lt;typename T, T N, T... I&gt;
struct make_integer_sequence_impl
    : std::conditional&lt;N==0, identity&lt;integer_sequence&lt;T, I...&gt;&gt;, make_integer_sequence_impl&lt;T, N-1, 0, 1+I...&gt;&gt;::type
{};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2406870</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2406870</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 03 Jul 2014 14:37:49 GMT</pubDate></item><item><title><![CDATA[Reply to LUT zu Compilezeit generieren lassen on Thu, 03 Jul 2014 15:23:56 GMT]]></title><description><![CDATA[<p>Ich nehme auch mein Kommentar bezüglich camper zurück, denn hier ist noch die C++1y-Lösung mit VTMPL:</p>
<pre><code>#include &quot;VTMPL/algorithms.hxx&quot;

// So ähnlich kann man auch das Klassentemplate von LUTher definieren - per Makros spezialisieren
constexpr unsigned char popcnt( unsigned char val )
{
#if defined __GNUG__ || defined __clang__
	return __builtin_popcountll(val);
#else // defined
	unsigned char count = 0;
	while( val )
	{
		count += val &amp; 1;
		val &gt;&gt;= 1;
	}

	return count;
#endif
}

#include &lt;climits&gt;

using type = vtmpl::generate&lt; UCHAR_MAX+1, vtmpl::functions::from_function_ptr&lt;unsigned char, popcnt&gt; &gt;;
// Zugriff auf das Array mit type::array
</code></pre>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6642">@camper</a>: Der Code ist falsch weil</p>
<p>§14.5.5/8 schrieb:</p>
<blockquote>
<p>The type of a template parameter corresponding to a specialized non-type argument shall not be dependent on a parameter of the specialization.</p>
</blockquote>
<p>Und das trifft auf</p>
<pre><code>template &lt;typename T, T... I&gt;
struct make_integer_sequence_impl&lt;T, 0, I...&gt;
                                     ^
</code></pre>
<p>Zu.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2406878</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2406878</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Thu, 03 Jul 2014 15:23:56 GMT</pubDate></item><item><title><![CDATA[Reply to LUT zu Compilezeit generieren lassen on Thu, 03 Jul 2014 15:28:08 GMT]]></title><description><![CDATA[<blockquote>
<p>Für eine std-Implementierung erwarte ich etwas bessers.</p>
</blockquote>
<p>Vom GCC 4.10-Snapshot, <code>&lt;utility&gt;</code></p>
<pre><code>template&lt;size_t... _Indexes&gt;
    struct _Index_tuple
    {
      typedef _Index_tuple&lt;_Indexes..., sizeof...(_Indexes)&gt; __next;
    };

  // Builds an _Index_tuple&lt;0, 1, 2, ..., _Num-1&gt;.
  template&lt;size_t _Num&gt;
    struct _Build_index_tuple
    {
      typedef typename _Build_index_tuple&lt;_Num - 1&gt;::__type::__next __type;
    };

  template&lt;&gt;
    struct _Build_index_tuple&lt;0&gt;
    {
      typedef _Index_tuple&lt;&gt; __type;
    };

// [...]

  template&lt;typename _Tp, _Tp _Num,
	   typename _ISeq = typename _Build_index_tuple&lt;_Num&gt;::__type&gt;
    struct _Make_integer_sequence;

  template&lt;typename _Tp, _Tp _Num,  size_t... _Idx&gt;
    struct _Make_integer_sequence&lt;_Tp, _Num, _Index_tuple&lt;_Idx...&gt;&gt;
    {
      static_assert( _Num &gt;= 0,
		     &quot;Cannot make integer sequence of negative length&quot; );

      typedef integer_sequence&lt;_Tp, static_cast&lt;_Tp&gt;(_Idx)...&gt; __type;
    };
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2406879</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2406879</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Thu, 03 Jul 2014 15:28:08 GMT</pubDate></item><item><title><![CDATA[Reply to LUT zu Compilezeit generieren lassen on Fri, 04 Jul 2014 00:27:27 GMT]]></title><description><![CDATA[<p>@LUTher<br />
Du willst definitiv keinen 64K grossen Lookup-Table. Weil dir der die Performance ruiniert.<br />
Also entweder gleich die von Arcoth vorgeschlagene Intrinsic-Version, oder - wie auch schon vorgeschlagen wurde - einen Table mit 256 Werten und dann ggf. je nach char-Breite zwei oder mehr Lookups machen und zusammenaddieren.</p>
<pre><code class="language-cpp">size_t my_popcnt(unsigned char ch)
{
    return lut[ch &amp; 0xFF]
#if CHAR_BIT &gt; 8
         + lut[(ch &gt;&gt; 8) &amp; 0xFF]
#if CHAR_BIT &gt; 16
         + lut[(ch &gt;&gt; 16) &amp; 0xFF]
#if CHAR_BIT &gt; 24
         + lut[(ch &gt;&gt; 24) &amp; 0xFF]
#if CHAR_BIT &gt; 32
#error F*ck this shit!
#endif
#endif
#endif
#endif
    ;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2406924</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2406924</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 04 Jul 2014 00:27:27 GMT</pubDate></item></channel></rss>