Files
rtabmap/preview/pr-1492/api/latest/group__UtiLite.html
T

225 lines
19 KiB
HTML
Raw Normal View History

<!-- HTML header for doxygen 1.9.8-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>RTAB-Map: UtiLite</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>
<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>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<script type="text/javascript">window.RTABMAP_DOC_ROOT="";</script>
<script type="text/javascript" src="../versions.js"></script>
<script type="text/javascript" src="version-switcher.js"></script>
</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 id="projectrow">
<td id="projectalign">
<div id="projectname">RTAB-Map<span id="projectnumber">&#160;0.23.10</span>
</div>
<div id="projectbrief">Real-Time Appearance-Based Mapping</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></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">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(document).ready(function(){initNavTree('group__UtiLite.html',''); initResizable(); });
/* @license-end */
</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">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
<div class="headertitle"><div class="title">UtiLite</div></div>
</div><!--header-->
<div class="contents">
<h1><a class="anchor" id="intro"></a>
Introduction</h1>
<p><a href="http://utilite.googlecode.com">UtiLite</a> is a simple library to create small cross-platform applications using <b>threads</b>, <b>events-based communication</b> and a powerful <b>logger</b>. The first three sections show the core classes of the library, then last sections show some useful functions added through time.</p>
<p>UtiLite provides a utility application called <a class="el" href="uResourceGeneratorPage.html">uResourceGenerator</a> to generate resources to include in an executable. For example: </p><div class="fragment"><div class="line">$ <a class="code hl_namespace" href="namespacertabmap.html">rtabmap</a>-res_tool DatabaseSchema.sql</div>
<div class="ttc" id="anamespacertabmap_html"><div class="ttname"><a href="namespacertabmap.html">rtabmap</a></div><div class="ttdef"><b>Definition</b> <a href="BayesFilter_8h_source.html#l00039">BayesFilter.h:39</a></div></div>
</div><!-- fragment --><p> This will generate a HEX file "DatabaseSchema_sql.h" which can be included in source files. Data of the file is global and can be accessed by the generated const char * DATABASESCHEMA_SQL. </p><div class="fragment"><div class="line"><span class="preprocessor">#include &quot;DatabaseSchema_sql.h&quot;</span></div>
<div class="line">...</div>
<div class="line">std::string hex = DATABASESCHEMA_SQL;</div>
<div class="line"><span class="comment">// Assuming there are only ASCII characters, we can directly convert to a string:</span></div>
<div class="line">std::string schema = <a class="code hl_function" href="UConversion_8h.html#a6d66453336bccd040539ac9905a9c409">uHex2Str</a>(hex);</div>
<div class="line"><span class="comment">// For binary data:</span></div>
<div class="line">std::vector&lt;char&gt; bytes = <a class="code hl_function" href="UConversion_8h.html#aafb2c6939780df0241eb35ab4fc8b91b">uHex2Bytes</a>(hex);</div>
<div class="ttc" id="aUConversion_8h_html_a6d66453336bccd040539ac9905a9c409"><div class="ttname"><a href="UConversion_8h.html#a6d66453336bccd040539ac9905a9c409">uHex2Str</a></div><div class="ttdeci">std::string UTILITE_EXPORT uHex2Str(const std::string &amp;hex)</div></div>
<div class="ttc" id="aUConversion_8h_html_aafb2c6939780df0241eb35ab4fc8b91b"><div class="ttname"><a href="UConversion_8h.html#aafb2c6939780df0241eb35ab4fc8b91b">uHex2Bytes</a></div><div class="ttdeci">std::vector&lt; char &gt; UTILITE_EXPORT uHex2Bytes(const std::string &amp;hex)</div></div>
</div><!-- fragment --><h1><a class="anchor" id="logger"></a>
ULogger</h1>
<p>The <a class="el" href="classULogger.html">ULogger</a> can be used anywhere in the application to log messages (formated like a printf). The logger can be set (<a class="el" href="classULogger.html#a0fe73ce7c193ff399bca16b8d4d4cabb">ULogger::setType()</a>) to print in a file or in the console (with colors depending on the severity). Convenient macros are given, working like a printf(), as <a class="el" href="ULogger_8h.html#a9104cb408bf9019db2a2c4476835db4a">UDEBUG()</a>, <a class="el" href="ULogger_8h.html#a5b63c9a1441181723754c0c6084231a8">UINFO()</a>, <a class="el" href="ULogger_8h.html#ab5a739ad9340455e46eaa570f8223d9a">UWARN()</a>, <a class="el" href="ULogger_8h.html#a1249ddbc4c9cc43be53048c08dda129b">UERROR()</a>, <a class="el" href="ULogger_8h.html#aabc10368a622911d56a4dd5a4b461385">UFATAL()</a>, <a class="el" href="ULogger_8h.html#ab3436168e27946669bbd4c76e4c4007e">UASSERT()</a>. Small example: </p><div class="fragment"><div class="line">...</div>
<div class="line">UINFO(<span class="stringliteral">&quot;A simple message with number %d&quot;</span>, 42);</div>
<div class="line"><a class="code hl_define" href="ULogger_8h.html#a9104cb408bf9019db2a2c4476835db4a">UDEBUG</a>(<span class="stringliteral">&quot;A debug message&quot;</span>);</div>
<div class="line">...</div>
<div class="ttc" id="aULogger_8h_html_a9104cb408bf9019db2a2c4476835db4a"><div class="ttname"><a href="ULogger_8h.html#a9104cb408bf9019db2a2c4476835db4a">UDEBUG</a></div><div class="ttdeci">#define UDEBUG(...)</div><div class="ttdef"><b>Definition</b> <a href="ULogger_8h_source.html#l00059">ULogger.h:59</a></div></div>
</div><!-- fragment --><p> This will print: [Severity] (Time) File:Line:Function() "The message" </p><div class="fragment"><div class="line">[ INFO] (2010-09-25 18:08:20) main.cpp:18::main() A simple message with number 42</div>
<div class="line">[DEBUG] (2010-09-25 18:08:20) main.cpp:18::main() A debug message</div>
</div><!-- fragment --><h1><a class="anchor" id="eventsmanager"></a>
UEventsManager, UEventsHandler, UEvent</h1>
<p>The events-based communication framework helps to communicate between objects/threads. The <a class="el" href="classUEventsManager.html">UEventsManager</a> is a singleton with which we can post events anywhere in the application by calling <a class="el" href="classUEventsManager.html#a956353a8006abe2edb0be2e1fc1846cb">UEventsManager::post()</a>. All <a class="el" href="classUEventsHandler.html">UEventsHandler</a> will then receive the event with their protected function <a class="el" href="classUEventsHandler.html#a0d43b582c19f01196a513f66d3618d8d">UEventsHandler::handleEvent()</a>. Handlers are added to <a class="el" href="classUEventsManager.html">UEventsManager</a> by calling <a class="el" href="classUEventsManager.html#a3bb033062e4a0eb59efdf5f84d170388">UEventsManager::addHandler()</a>. The <a class="el" href="classUEvent.html">UEvent</a> provides an abstract class to implement any event implementations. The only requirement is that the event must implements <a class="el" href="classUEvent.html#a2c7d278240ad4b7d88a2c534cc5f47b4">UEvent::getClassName()</a> to know the event's type. </p><div class="fragment"><div class="line">...</div>
<div class="line">MyHandler handler; <span class="comment">// MyHandler is an implementation of UEventsHandler</span></div>
<div class="line"><a class="code hl_function" href="classUEventsManager.html#a3bb033062e4a0eb59efdf5f84d170388">UEventsManager::addHandler</a>(&amp;handler);</div>
<div class="line"><a class="code hl_function" href="classUEventsManager.html#a956353a8006abe2edb0be2e1fc1846cb">UEventsManager::post</a>(<span class="keyword">new</span> MyEvent()); <span class="comment">// MyEvent is an implementation of UEvent</span></div>
<div class="line"><span class="comment">// The UEventsHandler::handleEvent() of &quot;handler&quot; will then be called by the UEventsManager&#39;s events dispatching thread.</span></div>
<div class="line">...</div>
<div class="ttc" id="aclassUEventsManager_html_a3bb033062e4a0eb59efdf5f84d170388"><div class="ttname"><a href="classUEventsManager.html#a3bb033062e4a0eb59efdf5f84d170388">UEventsManager::addHandler</a></div><div class="ttdeci">static void addHandler(UEventsHandler *handler)</div></div>
<div class="ttc" id="aclassUEventsManager_html_a956353a8006abe2edb0be2e1fc1846cb"><div class="ttname"><a href="classUEventsManager.html#a956353a8006abe2edb0be2e1fc1846cb">UEventsManager::post</a></div><div class="ttdeci">static void post(UEvent *event, bool async=true, const UEventsSender *sender=0)</div></div>
</div><!-- fragment --><p> Look at the <b>full example</b> in page of <a class="el" href="classUEventsHandler.html">UEventsHandler</a> on how communication works with threads (<a class="el" href="classUThread.html">UThread</a>).</p>
<h1><a class="anchor" id="thread"></a>
UThread, UMutex, USemaphore</h1>
<p>The multi-threading framework use a <a class="el" href="classUThread.html">UThread</a> as an abstract class to implement a thread in object-style. Reimplement UThread::mainLoop() then call <a class="el" href="classUThread.html#a051e9adcf24f92b9c8e31acd06bad88c">UThread::start()</a> to start the main loop of the thread. Threads can be joined by calling <a class="el" href="classUThread.html#acf33c0e4b656af76da100e7d4f69ed1d">UThread::join()</a> and killed by calling <a class="el" href="classUThread.html#a8dfefcfd68b453da08ddba9836f35965">UThread::kill()</a>. Classes <a class="el" href="classUMutex.html">UMutex</a> and <a class="el" href="classUSemaphore.html">USemaphore</a> provide blocking mechanisms to protect data between threads. </p><div class="fragment"><div class="line">...</div>
<div class="line">MyThread t; <span class="comment">// MyThread is an implementation of UThread</span></div>
<div class="line">t.start();</div>
<div class="line">t.join(); <span class="comment">// Wait the thread to finish</span></div>
<div class="line">...</div>
</div><!-- fragment --><h1><a class="anchor" id="timer"></a>
UTimer</h1>
<p>A useful class to compute processing time:</p><ul>
<li><a class="el" href="classUTimer.html#a10f628d8be04474d13c04b07c0426200">UTimer::start()</a>,</li>
<li><a class="el" href="classUTimer.html#a6a517d6f5f6e6c28b9392d04be22a320">UTimer::stop()</a>,</li>
<li><a class="el" href="classUTimer.html#aa4db57cf682a403fba8ddf95d268d2a6">UTimer::restart()</a>,</li>
<li><a class="el" href="classUTimer.html#a372405f02e1d4e9571a73d80962d6f4c">UTimer::elapsed()</a>,</li>
<li><a class="el" href="classUTimer.html#ad10fce2a4901bf5d6a460ca7b158cb3a">UTimer::now()</a>.</li>
</ul>
<h1><a class="anchor" id="filedir"></a>
UDirectory, UFile</h1>
<p>For files and directories manipulations :</p><ul>
<li><a class="el" href="classUFile.html#a4963afa70289718a3bd1ca50b6adb420">UFile::exists()</a>,</li>
<li><a class="el" href="classUFile.html#a0c42f32c914b349d13103d0397c1b3c1">UFile::length()</a>,</li>
<li><a class="el" href="classUFile.html#a725e2edf4b5f603bfc688e96c76858d4">UFile::rename()</a>,</li>
<li><a class="el" href="classUFile.html#a1faba3e78bb915a685d82f0696e1ec02">UFile::erase()</a>,</li>
<li><a class="el" href="classUDirectory.html#ad82410f2502789f23d30984a5b1d7724">UDirectory::exists()</a>,</li>
<li><a class="el" href="classUDirectory.html#aa16e64be3cc238eec871bddaf6dbc289">UDirectory::getFileNames()</a>,</li>
<li><a class="el" href="classUDirectory.html#a8d84cde6736b614a4396f16113f4d365">UDirectory::makeDir()</a>,</li>
<li><a class="el" href="classUDirectory.html#a78d8896627c8675a19b0c6fe6d9e274a">UDirectory::removeDir()</a>,</li>
<li><a class="el" href="classUDirectory.html#a30b3c4e8f81892e5ea04bdab3beba900">UDirectory::currentDir()</a>,</li>
<li><a class="el" href="classUDirectory.html#a3338b47405f65f25a4256e0ea86bff07">UDirectory::homeDir()</a>,</li>
</ul>
<h1><a class="anchor" id="stl"></a>
Convenient use of STL</h1>
<p>The library provides some simple wrappers of the STL like:</p><ul>
<li><a class="el" href="UStl_8h.html#a62335030b4c0d80f80e7c4a21721c05e">uUniqueKeys()</a> to get unique keys from a std::multimap,</li>
<li><a class="el" href="UStl_8h.html#aa67c880cc8f27c9270c7bd4bdce62ca7">uKeys()</a> to get all keys of a std::multimap or std::map,</li>
<li><a class="el" href="UStl_8h.html#a745b929c605a3d6b0014dff0c9c2a314">uValues()</a> to get all values of a std::multimap or std::map,</li>
<li><a class="el" href="UStl_8h.html#a155cd26667d2f88ee05dd3d819ae8182">uValue()</a> to get the value of a key (with a default argument if the key is not found),</li>
<li><a class="el" href="UStl_8h.html#a6242bd5879bd7f06b8de6498650aa3b7">uTake()</a> to take the value of a key (with a default argument if the key is not found),</li>
<li><a class="el" href="UStl_8h.html#aa8bd447989a2ac6dbd4537cabdb9b8a2">uIteratorAt()</a> to get iterator at a specified position in a std::list,</li>
<li><a class="el" href="UStl_8h.html#a27a0f94be07c53df9827b082eb107337">uValueAt()</a> to get value at a specified position in a std::list,</li>
<li><a class="el" href="UStl_8h.html#a4cad7064de642559152c873f2ca9a471">uContains()</a> to know if a key/value exists in a std::multimap, std::map, std::list,</li>
<li><a class="el" href="UStl_8h.html#ac9c9d1520c7facb601ae56cab3762b41">uInsert()</a> to insert a value in a std::map and overwriting the value if the key already exists,</li>
<li><a class="el" href="UStl_8h.html#a85cf086e57dd289775cf2fd7c82a6ffe">uListToVector()</a>,</li>
<li><a class="el" href="UStl_8h.html#a5a5fb7b34b8c3adb63d641358b7a7e1b">uVectorToList()</a>,</li>
<li><a class="el" href="UStl_8h.html#a472c2e123cd6eb04165b2d3461a634d3">uAppend()</a> to append a list to another list,</li>
<li><a class="el" href="UStl_8h.html#ad3918a32500de71ba8bb7aab99dccf46">uIndexOf()</a> to get index of a value in a std::list,</li>
<li><a class="el" href="UStl_8h.html#ab1862437019327ce8419569e3c2ea90f">uSplit()</a> to split a string into a std::list of strings on the specified separator.</li>
</ul>
<h1><a class="anchor" id="math"></a>
Basic mathematic operations</h1>
<p>A library of basic array manipulations:</p><ul>
<li><a class="el" href="UMath_8h.html#a1362990d0ce7f09ef735292cc480fa23">uMax()</a>,</li>
<li><a class="el" href="UMath_8h.html#a6e100ed2031a529679a93b9b4bf818af">uSign()</a>,</li>
<li><a class="el" href="UMath_8h.html#a81a1c24c0229e6c4dc8d8e09497ad114">uSum()</a>,</li>
<li><a class="el" href="UMath_8h.html#a7376638ab6047306c66a357153a47196">uMean()</a>,</li>
<li>uStdDev(),</li>
<li><a class="el" href="UMath_8h.html#ab5e611c29307d8733cfaebc68bed1ac6">uNorm()</a>,</li>
<li><a class="el" href="UMath_8h.html#a2f843f6f6bf0bd59b527aaa8c4731612">uNormalize()</a>,</li>
<li><a class="el" href="UMath_8h.html#a913829c5228fabff88e4918111c1d424">uXMatch()</a>.</li>
</ul>
<h1><a class="anchor" id="conversion"></a>
Conversion</h1>
<p>A library of convenient functions to convert some data into another like:</p><ul>
<li><a class="el" href="UConversion_8h.html#ac17caccd78f21956b7ddb78aa0c0c438">uReplaceChar()</a>,</li>
<li><a class="el" href="UConversion_8h.html#adc98c4d87bc7c13b7fc5b5504f457105">uToUpperCase()</a>,</li>
<li><a class="el" href="UConversion_8h.html#a426b88c678e06f77912c006ba02805ec">uToLowerCase()</a>,</li>
<li><a class="el" href="UConversion_8h.html#aa2bbc65658f335e92631e9f1d091a698">uNumber2Str()</a>,</li>
<li><a class="el" href="UConversion_8h.html#ad80132c4fed005af5c96b39fca453ce6">uBool2Str()</a>,</li>
<li><a class="el" href="UConversion_8h.html#abb8205ea44ccbebab8cf064fed0c7c1b">uStr2Bool()</a>,</li>
<li><a class="el" href="UConversion_8h.html#a51c595b50bcb99186160a9e18df13c60">uBytes2Hex()</a>,</li>
<li><a class="el" href="UConversion_8h.html#aafb2c6939780df0241eb35ab4fc8b91b">uHex2Bytes()</a>,</li>
<li><a class="el" href="UConversion_8h.html#aafb2c6939780df0241eb35ab4fc8b91b">uHex2Bytes()</a>,</li>
<li><a class="el" href="UConversion_8h.html#a6d66453336bccd040539ac9905a9c409">uHex2Str()</a>,</li>
<li><a class="el" href="UConversion_8h.html#a03dfb0596b84e5673061561a1388b4ee">uHex2Ascii()</a>,</li>
<li><a class="el" href="UConversion_8h.html#a6c8b49faa5c59294f350dda7152f66a4">uAscii2Hex()</a>,</li>
<li><a class="el" href="UConversion_8h.html#a9b62bc055b0d262a21af6b9e00b6db5f">uFormatv()</a>,</li>
<li><a class="el" href="UConversion_8h.html#a59ad5e2b3368d3dd19d73a24159388ce">uFormat()</a>.</li>
</ul>
<h1><a class="anchor" id="processinfo"></a>
UProcessInfo</h1>
<p>This class can be used to get the process memory usage: <a class="el" href="classUProcessInfo.html#a8a494e68cdea348a4788b8d54fd7de40" title="Get the memory used by the current process.">UProcessInfo::getMemoryUsage()</a>. </p>
</div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8 </li>
</ul>
</div>
</body>
</html>