Foobar2000:Development:Auto Pointers

From Hydrogenaudio Knowledgebase
Revision as of 20:09, 21 June 2022 by DEATH (talk | contribs) (Created page with "Category:Foobar2000 Development When performing most kinds of service operations, <code>service_ptr_t<T></code> template should be used instead of working with service po...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.


When performing most kinds of service operations, service_ptr_t<T> template should be used instead of working with service pointers directly; it automatically manages reference counting, ensuring that the service object is deleted when it is no longer referenced.

For convenience, all service classes have myclass::ptr typedef'd to service_ptr_t<myclass>.

When working with pointers to core fb2k services, just use C++11 auto keyword and someclass::get(), e.g. auto myAPI = playlist_manager::get();

service_ptr_t<> provides additional convenience operators:

  • operator&=

Attempts to obtain a pointer to another interface, if the passed object supports it. Returns true on success, false on failure.

service_ptr_t<service1> A; 
service_ptr_t<service2> B;
A = create_service1();
if ( B &= A ) {
  // do stuff with B
} else {
  // A does not implement service2, or is null
}
  • operator^=

Forced cast. Use to obtain a valid pointer to another interface in a scenario where you know that the object supports it.

There's no error return, the process crashes if the interface you ask for is not implemented by this object.

service_ptr_t<service1> A; 
service_ptr_t<service2> B;
A = create_service1();
B ^= A;
// if you get here, B is valid (or null if A was null)

Use the above operators to safely cast from parent service class to derived service class. Do not use C++ dynamic_cast<> / static_cast<> / reinterpret_cast<> on foobar2000 service classes.