Cleanup utils.hh, remove auto_raii in favor of on_scope_end
This commit is contained in:
parent
e36b3565bf
commit
5710893dd5
|
@ -25,7 +25,8 @@ CandidateList complete_filename(const String& prefix,
|
||||||
fileprefix = String(dir_end + 1, real_prefix.end());
|
fileprefix = String(dir_end + 1, real_prefix.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
auto dir = auto_raii(opendir(dirname.c_str()), closedir);
|
DIR* dir = opendir(dirname.c_str());
|
||||||
|
auto closeDir = on_scope_end([=](){ closedir(dir); });
|
||||||
|
|
||||||
CandidateList result;
|
CandidateList result;
|
||||||
if (not dir)
|
if (not dir)
|
||||||
|
|
105
src/utils.hh
105
src/utils.hh
|
@ -9,58 +9,10 @@
|
||||||
|
|
||||||
namespace Kakoune
|
namespace Kakoune
|
||||||
{
|
{
|
||||||
|
// *** Singleton ***
|
||||||
template<typename Container>
|
//
|
||||||
struct ReversedContainer
|
// Singleton helper class, every singleton type T should inherit
|
||||||
{
|
// from Singleton<T> to provide a consistent interface.
|
||||||
ReversedContainer(Container& container) : container(container) {}
|
|
||||||
Container& container;
|
|
||||||
|
|
||||||
decltype(container.rbegin()) begin() { return container.rbegin(); }
|
|
||||||
decltype(container.rend()) end() { return container.rend(); }
|
|
||||||
};
|
|
||||||
|
|
||||||
template<typename Container>
|
|
||||||
ReversedContainer<Container> reversed(Container& container)
|
|
||||||
{
|
|
||||||
return ReversedContainer<Container>(container);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
bool operator== (const std::unique_ptr<T>& lhs, T* rhs)
|
|
||||||
{
|
|
||||||
return lhs.get() == rhs;
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T, typename F>
|
|
||||||
class AutoRaii
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
AutoRaii(T* resource, F cleanup)
|
|
||||||
: m_resource(resource), m_cleanup(cleanup) {}
|
|
||||||
|
|
||||||
AutoRaii(AutoRaii&& other) : m_resource(other.m_resource),
|
|
||||||
m_cleanup(other.m_cleanup)
|
|
||||||
{ other.m_resource = nullptr; }
|
|
||||||
|
|
||||||
AutoRaii(const AutoRaii&) = delete;
|
|
||||||
AutoRaii& operator=(const AutoRaii&) = delete;
|
|
||||||
|
|
||||||
~AutoRaii() { if (m_resource) m_cleanup(m_resource); }
|
|
||||||
|
|
||||||
operator T*() { return m_resource; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
T* m_resource;
|
|
||||||
F m_cleanup;
|
|
||||||
};
|
|
||||||
|
|
||||||
template<typename T, typename F>
|
|
||||||
AutoRaii<T, F> auto_raii(T* resource, F cleanup)
|
|
||||||
{
|
|
||||||
return AutoRaii<T, F>(resource, cleanup);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
class Singleton
|
class Singleton
|
||||||
{
|
{
|
||||||
|
@ -76,8 +28,8 @@ public:
|
||||||
|
|
||||||
static void delete_instance()
|
static void delete_instance()
|
||||||
{
|
{
|
||||||
if (ms_instance)
|
|
||||||
delete ms_instance;
|
delete ms_instance;
|
||||||
|
ms_instance = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -100,6 +52,25 @@ private:
|
||||||
template<typename T>
|
template<typename T>
|
||||||
T* Singleton<T>::ms_instance = nullptr;
|
T* Singleton<T>::ms_instance = nullptr;
|
||||||
|
|
||||||
|
// *** Containers helpers ***
|
||||||
|
|
||||||
|
template<typename Container>
|
||||||
|
struct ReversedContainer
|
||||||
|
{
|
||||||
|
ReversedContainer(Container& container) : container(container) {}
|
||||||
|
Container& container;
|
||||||
|
|
||||||
|
decltype(container.rbegin()) begin() { return container.rbegin(); }
|
||||||
|
decltype(container.rend()) end() { return container.rend(); }
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename Container>
|
||||||
|
ReversedContainer<Container> reversed(Container& container)
|
||||||
|
{
|
||||||
|
return ReversedContainer<Container>(container);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
template<typename Container, typename T>
|
template<typename Container, typename T>
|
||||||
auto find(Container& container, const T& value) -> decltype(container.begin())
|
auto find(Container& container, const T& value) -> decltype(container.begin())
|
||||||
{
|
{
|
||||||
|
@ -112,11 +83,16 @@ bool contains(const Container& container, const T& value)
|
||||||
return find(container, value) != container.end();
|
return find(container, value) != container.end();
|
||||||
}
|
}
|
||||||
|
|
||||||
inline String str_to_str(const String& str)
|
// *** On scope end ***
|
||||||
{
|
//
|
||||||
return str;
|
// on_scope_end provides a way to register some code to be
|
||||||
}
|
// executed when current scope closes.
|
||||||
|
//
|
||||||
|
// usage:
|
||||||
|
// auto cleaner = on_scope_end([]() { ... });
|
||||||
|
//
|
||||||
|
// This permits to cleanup c-style resources without implementing
|
||||||
|
// a wrapping class
|
||||||
template<typename T>
|
template<typename T>
|
||||||
class OnScopeEnd
|
class OnScopeEnd
|
||||||
{
|
{
|
||||||
|
@ -133,6 +109,19 @@ OnScopeEnd<T> on_scope_end(T t)
|
||||||
return OnScopeEnd<T>(t);
|
return OnScopeEnd<T>(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// *** Misc helper functions ***
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
bool operator== (const std::unique_ptr<T>& lhs, T* rhs)
|
||||||
|
{
|
||||||
|
return lhs.get() == rhs;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline String str_to_str(const String& str)
|
||||||
|
{
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // utils_hh_INCLUDED
|
#endif // utils_hh_INCLUDED
|
||||||
|
|
Loading…
Reference in New Issue
Block a user