<table><tr><td style="">fabiank added a comment.
</td><a style="text-decoration: none; padding: 4px 8px; margin: 0 8px 8px; float: right; color: #464C5C; font-weight: bold; border-radius: 3px; background-color: #F7F7F9; background-image: linear-gradient(to bottom,#fff,#f1f0f1); display: inline-block; border: 1px solid rgba(71,87,120,.2);" href="https://phabricator.kde.org/D11815">View Revision</a></tr></table><br /><div><div><p>Anything I can do to convince you that templates are awesome, and we should use them ;-)? My main argument is that this improves type safety and allows to catch off by one errors when indexing the arrays (and it enables iteration with range based for, which I haven't implemented yet, though). It also helped me catch that Q_ASSERT weirdness in <a href="https://phabricator.kde.org/D11814" style="background-color: #e7e7e7;
border-color: #e7e7e7;
border-radius: 3px;
padding: 0 4px;
font-weight: bold;
color: black;text-decoration: none;">D11814</a>, as with the std::array, that assignment became illegal.</p>
<p>However, if you think that the template makes the code more complicated than it was before, I'm willing to remove that part of the change set – the goal of my changes is to make the code easier to maintain after all.</p></div></div><br /><div><strong>INLINE COMMENTS</strong><div><div style="margin: 6px 0 12px 0;"><div style="border: 1px solid #C7CCD9; border-radius: 3px;"><div style="padding: 0; background: #F7F7F7; border-color: #e3e4e8; border-style: solid; border-width: 0 0 1px 0; margin: 0;"><div style="color: #74777d; background: #eff2f4; padding: 6px 8px; overflow: hidden;"><a style="float: right; text-decoration: none;" href="https://phabricator.kde.org/D11815#inline-59221">View Inline</a><span style="color: #4b4d51; font-weight: bold;">aacid</span> wrote in <span style="color: #4b4d51; font-weight: bold;">patsolve.cpp:986</span></div>
<div style="margin: 8px 0; padding: 0 12px; color: #74777D;"><p style="padding: 0; margin: 8px;">Why do you need all this lines?</p></div></div>
<div style="margin: 8px 0; padding: 0 12px;"><p style="padding: 0; margin: 8px;">I assume you mean all the template class<number> lines? This is mostly about compile times. This file contains the implementation of multiple templated methods, and those must be instantiated at some point, else we'll get an error at link time. There are generally 2 possible ways to achieve this:</p>
<ol class="remarkup-list">
<li class="remarkup-list-item">This file gets included together with its header file, and the method definitions are visible to its users when the template is instantiated, so everything is alright.</li>
<li class="remarkup-list-item">The way I've done it: The method definitions are only visible here, and for each possible user, we instantiate the template. Then at link time, the compiler has emitted the necessary code and the linker can find it. Drawback: Those lines look weird to uninitiated, as you've just demonstrated. Pro: The code doesn't get included multiple times, and when 2 Solver subclasses have the same number of piles, the code gets only generated once. (With the 1st approach, the compiler would create the code once per translation unit, and at link time it would be merged.)</li>
</ol>
<p style="padding: 0; margin: 8px;">I'm fine with either changing the approach to 1, or adding some documentation to make the code more understandable.</p></div></div></div></div></div><br /><div><strong>REPOSITORY</strong><div><div>R410 KPatience</div></div></div><br /><div><strong>REVISION DETAIL</strong><div><a href="https://phabricator.kde.org/D11815">https://phabricator.kde.org/D11815</a></div></div><br /><div><strong>To: </strong>fabiank, KDE Games<br /><strong>Cc: </strong>aacid, KDE Games<br /></div>