-
Notifications
You must be signed in to change notification settings - Fork 4
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
749 changed files
with
16,249 additions
and
2,695 deletions.
There are no files selected for viewing
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,130 @@ | ||
<!-- HTML header for doxygen 1.8.11--> | ||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> | ||
<html xmlns="http://www.w3.org/1999/xhtml"> | ||
<head> | ||
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> | ||
<meta http-equiv="X-UA-Compatible" content="IE=9"/> | ||
<meta name="generator" content="Doxygen 1.8.11"/> | ||
<title>XTL: Hierarchy-Generation.md Source File</title> | ||
<link href="tabs.css" rel="stylesheet" type="text/css"/> | ||
<script type="text/javascript" src="jquery.js"></script> | ||
<script type="text/javascript" src="dynsections.js"></script> | ||
<link href="navtree.css" rel="stylesheet" type="text/css"/> | ||
<script type="text/javascript" src="resize.js"></script> | ||
<script type="text/javascript" src="navtreedata.js"></script> | ||
<script type="text/javascript" src="navtree.js"></script> | ||
<script type="text/javascript"> | ||
$(document).ready(initResizable); | ||
$(window).load(resizeHeight); | ||
</script> | ||
<link href="search/search.css" rel="stylesheet" type="text/css"/> | ||
<script type="text/javascript" src="search/searchdata.js"></script> | ||
<script type="text/javascript" src="search/search.js"></script> | ||
<script type="text/javascript"> | ||
$(document).ready(function() { init_search(); }); | ||
</script> | ||
<link href="stylesheet.css" rel="stylesheet" type="text/css" /> | ||
</head> | ||
<body> | ||
<div id="top"><!-- do not remove this div, it is closed by doxygen! --> | ||
<div id="titlearea"> | ||
<table cellspacing="0" cellpadding="0"> | ||
<tbody> | ||
<tr style="height: 56px;"> | ||
<td id="projectlogo"><img alt="Logo" src="logo_tiny.png"/></td> | ||
<td id="projectalign" style="padding-left: 0.5em;"> | ||
<div id="projectname">XTL | ||
 <span id="projectnumber">0.1</span> | ||
</div> | ||
<div id="projectbrief">eXtended Template Library</div> | ||
</td> | ||
</tr> | ||
</tbody> | ||
</table> | ||
</div> | ||
<!-- end header part --> | ||
<!-- Generated by Doxygen 1.8.11 --> | ||
<script type="text/javascript"> | ||
var searchBox = new SearchBox("searchBox", "search",false,'Search'); | ||
</script> | ||
<div id="navrow1" class="tabs"> | ||
<ul class="tablist"> | ||
<li><a href="index.html"><span>Main Page</span></a></li> | ||
<li><a href="pages.html"><span>Related Pages</span></a></li> | ||
<li><a href="modules.html"><span>Modules</span></a></li> | ||
<li><a href="namespaces.html"><span>Namespaces</span></a></li> | ||
<li><a href="annotated.html"><span>Data Structures</span></a></li> | ||
<li class="current"><a href="files.html"><span>Files</span></a></li> | ||
<li><a href="examples.html"><span>Examples</span></a></li> | ||
<li> | ||
<div id="MSearchBox" class="MSearchBoxInactive"> | ||
<span class="left"> | ||
<img id="MSearchSelect" src="search/mag_sel.png" | ||
onmouseover="return searchBox.OnSearchSelectShow()" | ||
onmouseout="return searchBox.OnSearchSelectHide()" | ||
alt=""/> | ||
<input type="text" id="MSearchField" value="Search" accesskey="S" | ||
onfocus="searchBox.OnSearchFieldFocus(true)" | ||
onblur="searchBox.OnSearchFieldFocus(false)" | ||
onkeyup="searchBox.OnSearchFieldChange(event)"/> | ||
</span><span class="right"> | ||
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a> | ||
</span> | ||
</div> | ||
</li> | ||
</ul> | ||
</div> | ||
<div id="navrow2" class="tabs2"> | ||
<ul class="tablist"> | ||
<li><a href="files.html"><span>File List</span></a></li> | ||
<li><a href="globals.html"><span>Globals</span></a></li> | ||
</ul> | ||
</div> | ||
</div><!-- top --> | ||
<div id="side-nav" class="ui-resizable side-nav-resizable"> | ||
<div id="nav-tree"> | ||
<div id="nav-tree-contents"> | ||
<div id="nav-sync" class="sync"></div> | ||
</div> | ||
</div> | ||
<div id="splitbar" style="-moz-user-select:none;" | ||
class="ui-resizable-handle"> | ||
</div> | ||
</div> | ||
<script type="text/javascript"> | ||
$(document).ready(function(){initNavTree('_hierarchy-_generation_8md.html','');}); | ||
</script> | ||
<div id="doc-content"> | ||
<!-- window showing the filter options --> | ||
<div id="MSearchSelectWindow" | ||
onmouseover="return searchBox.OnSearchSelectShow()" | ||
onmouseout="return searchBox.OnSearchSelectHide()" | ||
onkeydown="return searchBox.OnSearchSelectKey(event)"> | ||
</div> | ||
|
||
<!-- iframe showing the search results (closed by default) --> | ||
<div id="MSearchResultsWindow"> | ||
<iframe src="javascript:void(0)" frameborder="0" | ||
name="MSearchResults" id="MSearchResults"> | ||
</iframe> | ||
</div> | ||
|
||
<div class="header"> | ||
<div class="headertitle"> | ||
<div class="title">Hierarchy-Generation.md</div> </div> | ||
</div><!--header--> | ||
<div class="contents"> | ||
<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> Hierarchy Generation</div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> ====================</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> This is a TMP pattern to generate a class hierarchy from a collection of policy classes. It permits arbitrarily mixing policies to generate rich components while avoiding multiple inheritance. It works by chaining together a series of policies in a linear class hierarchy through a couple controller templates.</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> </div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> The various policies are required to implement a parameterized super class idiom:</div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> ```{.cpp}</div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> template <class _SuperT> class OnClick : _SuperT {</div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>  ...</div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> };</div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> template <class _SuperT> class OnPaint : _SuperT {</div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span>  ...</div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> };</div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> template <class _SuperT> class OnResize : _SuperT {</div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span>  ...</div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> };</div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span> template <class _SuperT> class OnTimer : _SuperT {</div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span>  ...</div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span> };</div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span> ```</div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span> Each policy template is a self contained behavioral unit that describes an aspect of the larger whole. To maximize reuse they should be independent but it's possible to share information between them if care is taken.</div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span>  </div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span> The process of chaining the policies together is performed through a controller with the following declaration:</div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span> </div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span> ```{.cpp}</div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span> template <class _BaseT, template <class> class ... _PolicyList> </div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span> class HierarchyGenerator;</div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span> ```</div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span> </div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span> The parameters of the `HierarchyGenerator` are `_BaseT` and `_PolicyList`. The `_BaseT` parameter in this example is the super class of the entire hierarchy and will normally be a non-templated class. Policies are passed as parameters to the `HierarchyGenerator` in the `_PolicyList` parameter to successively declare a linear class hierarchy:</div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span> </div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span> ```{.cpp}</div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span> class Window{</div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span> ...</div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span> };</div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span> using Button = HierarchyGenerator<Window, OnClick, OnPaint, OnResize>;</div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span> using Label = HierarchyGenerator<Window, OnPaint>;</div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span> using Sizer = HierarchyGenerator<Window, OnClick, OnPaint, OnResize, OnTimer>;</div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span> using Timer = HierarchyGenerator<Window, OnTimer>;</div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span> ```</div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span> This results in linear class hierarchies composed of a mixture of policies. It equivalently declares the following:</div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span> </div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span> ```{.cpp}</div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span> using Button = OnClick<OnPaint<OnResize<Window>>>;</div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span> using Label = OnPaint<Window>;</div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span> using Sizer = OnClick<OnPaint<OnResize<OnTimer<Window>>>>;</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span> using Timer = OnTimer<Window>;</div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span> ```</div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span> The two forms are the same and the varation using the `HierarchyGenerator` is more verbose but the intent is clearer and more readable.</div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span> </div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span> The 'magic' is done through a couple partial specializations of `HierarchyGenerator`:</div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span> ```{.cpp}</div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span> template <typename _BaseT> class HierarchyGenerator<_BaseT> : public _BaseT{</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span>  template <typename ... _Args> HierarchyGenerator(_Args&&...oArgs) : _BaseT(std::forward<_Args>(oArgs)...){}</div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span> };</div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span> ```</div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span> This is the final specialization in the recusive template instantation chain that makes `_BaseT` the base class of all the policies. The compiler selects this specialization when the `_PolicyList` has been depleted of items. Chaining together the items in the `_PolicyList` is performed with the following partial specialization:</div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span> ```</div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span> template <typename _BaseT, template <class> class _PolicyT, template <class> class ... _PolicyList></div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span> class HierarchyGenerator<_BaseT, _PolicyT, _PolicyList...> : public _PolicyT< HierarchyGenerator<_PolicyList...>> {</div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span>  template <typename ... _Args> HierarchyGenerator(_Args&&...oArgs) </div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span>  : _PolicyT< HierarchyGenerator<_PolicyList...>>(std::forward<_Args>(oArgs)...){}</div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span> };</div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span> ```</div></div><!-- fragment --></div><!-- contents --> | ||
</div><!-- doc-content --> | ||
<!-- HTML footer for doxygen 1.8.11--> | ||
<!-- start footer part --> | ||
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! --> | ||
<ul> | ||
<li class="navelem"><b>Hierarchy-Generation.md</b></li> | ||
<li class="footer">Generated on Tue Jul 26 2016 11:34:47 for XTL by | ||
<a href="http://www.doxygen.org/index.html"> | ||
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li> | ||
</ul> | ||
</div> | ||
</body> | ||
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.