<div dir="ltr">LLDB's C++ API deals with SBxxx objects, most of which are PIMPL-style wrappers around an opaque pointer to the internal implementation. These SBxxx objects act as handles and are passed/returned by value, which is generally convenient, except for the situations where one would need to keep track of object identities, ex. using them as keys in associative containers.<div><br></div><div>As far as I can tell, there's a bit of inconsistency in the current state:</div><div><br></div><div>1. Some types, ex. SBThread, SBTarget, SBSection, ... offer ==, != that map directly to the corresponding operator on the opaque pointer (good!), but:</div><div>    .. there are no ordering operators, nor obvious ways to hash the objects</div><div>2. SBModule offer the == , != operators, but:</div><div>    ... the implementations for == and != are not exactly forwarded to the corresponding operator on the opaque pointer (1)<br></div><div>3. Things like SBFrame offer IsEqual() in addition to ==, !=, creating a bit of confusion</div><div>4. Other types (ex. SBProcess, SBSymbol, SBBlock) don't offer any kind of comparison operations.</div><div><br></div><div>IMO it would be nice to have a consistent "handle type" semantics regarding identity, ordering and hashing. I can see the following options:</div><div><br></div><div>1. Expose the opaque ptr as an opaque handle() </div><div>     - this is an easy, quick and convenient solution for many SBxxx types but it may not work for all</div><div>2. Design and implement a consistent, first class identity/ordering/hashing for all the SBxxx types</div><div>     - perhaps the most elegant and flexible approach, but also the most work</div><div><br></div><div>Any thoughts on this? Did I miss anything fundamental here?</div><div><br></div><div>Thanks,</div><div>Lemo.</div><div><br></div><div>(1) example of operator== from SBModule:</div><div><br></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><div style="color:rgb(0,0,0);font-family:"Droid Sans Mono",monospace,monospace,"Droid Sans Fallback";line-height:18px;white-space:pre"><div style=""><font size="1"><span style="color:rgb(0,0,255)">bool</span> SBModule::<span style="color:rgb(175,0,219)">operator</span>==(<span style="color:rgb(0,0,255)">const</span> SBModule &rhs) <span style="color:rgb(0,0,255)">const</span> {</font></div></div></div><div><div style="color:rgb(0,0,0);font-family:"Droid Sans Mono",monospace,monospace,"Droid Sans Fallback";line-height:18px;white-space:pre"><div><font size="1">  <span style="color:rgb(175,0,219)">if</span> (m_opaque_sp)</font></div></div></div><div><div style="color:rgb(0,0,0);font-family:"Droid Sans Mono",monospace,monospace,"Droid Sans Fallback";line-height:18px;white-space:pre"><div><font size="1">    <span style="color:rgb(175,0,219)">return</span> m_opaque_sp.<span style="color:rgb(121,94,38)">get</span>() == rhs.<span style="color:rgb(0,16,128)">m_opaque_sp</span>.<span style="color:rgb(121,94,38)">get</span>();</font></div></div></div><div><div style="color:rgb(0,0,0);font-family:"Droid Sans Mono",monospace,monospace,"Droid Sans Fallback";line-height:18px;white-space:pre"><div><font size="1">  <span style="color:rgb(175,0,219)">return</span> <span style="color:rgb(0,0,255)">false</span>;</font></div></div></div><div><div style="color:rgb(0,0,0);font-family:"Droid Sans Mono",monospace,monospace,"Droid Sans Fallback";line-height:18px;white-space:pre"><div><font size="1">}</font></div></div></div></blockquote><div><div style="color:rgb(0,0,0);font-family:"Droid Sans Mono",monospace,monospace,"Droid Sans Fallback";font-size:13px;line-height:18px;white-space:pre"><br></div></div><div><br></div></div>