From: Michael Starzinger Date: Tue, 11 Aug 2009 09:03:18 +0000 (+0200) Subject: * src/toolbox/hashtable.hpp: Added preliminary C++ hashtable class. X-Git-Url: http://wien.tomnetworks.com/gitweb/?p=cacao.git;a=commitdiff_plain;h=5d785d6eaf39b4470e35d399e045d2ef25c4bbda * src/toolbox/hashtable.hpp: Added preliminary C++ hashtable class. * src/threads/mutex.hpp (MutexLocker): Helper which might come in handy. (transplanted from aefdd2b45fcf0086266e43032ce0bda0a9f8a0f9) --HG-- extra : transplant_source : %AE%FD%D2%B4_%CF%00%86%26nC%03%2C%E0%BD%A0%A9%F8%A0%F9 --- diff --git a/src/threads/mutex.hpp b/src/threads/mutex.hpp index e8bbce33c..d4e7c6b11 100644 --- a/src/threads/mutex.hpp +++ b/src/threads/mutex.hpp @@ -32,6 +32,23 @@ # include "threads/posix/mutex-posix.hpp" #endif +#if __cplusplus + +/** + * Helper class used to implicitly acquire and release a mutex + * within a method scope. + */ +class MutexLocker { +private: + Mutex& _mutex; + +public: + MutexLocker(Mutex& mutex) : _mutex(mutex) { _mutex.lock(); } + ~MutexLocker() { _mutex.unlock(); } +}; + +#endif + #endif /* _MUTEX_HPP */ diff --git a/src/toolbox/hashtable.hpp b/src/toolbox/hashtable.hpp new file mode 100644 index 000000000..0c34db63f --- /dev/null +++ b/src/toolbox/hashtable.hpp @@ -0,0 +1,105 @@ +/* src/toolbox/hashtable.hpp - hashtable classes + + Copyright (C) 2009 + CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO + Copyright (C) 2009 Theobroma Systems Ltd. + + This file is part of CACAO. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2, or (at + your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. + +*/ + + +#ifndef _HASHTABLE_HPP +#define _HASHTABLE_HPP + +#include "config.h" + +#if __cplusplus + +// XXX This is a TR1 header and not (yet) part of the C++ standard, so we +// should not use it. The solution is to implement the below stuff +// ourselves. This will be done, sometimes, soon, I hope ... +#include + + +/** + * Default hashing function for hashtable implementation. + */ +template class Hasher { + // XXX Implement me! +}; + + +/** + * Hashtable implementation. + */ +template, + class Pred = std::equal_to > +class Hashtable : + protected std::tr1::unordered_map { +public: + // Constructor. + Hashtable(size_t n) : std::tr1::unordered_map(n) {} + + // Make iterator of TR1 unordered map visible. + using std::tr1::unordered_map::iterator; + + // Make functions of TR1 unordered map visible. + using std::tr1::unordered_map::end; + using std::tr1::unordered_map::find; + using std::tr1::unordered_map::insert; +}; + + +// Required by LockableHashtable. +#include "threads/mutex.hpp" + + +/** + * Hashtable implementation with a Mutex. + */ +template, + class Pred = std::equal_to > +class LockableHashtable : + public Hashtable, + public Mutex { +public: + // Constructor. + LockableHashtable(size_t n) : Hashtable(n) {} +}; + +#endif + +#endif /* _HASHTABLE_HPP */ + + +/* + * These are local overrides for various environment variables in Emacs. + * Please do not remove this and leave it at the end of the file, where + * Emacs will automagically detect them. + * --------------------------------------------------------------------- + * Local variables: + * mode: c++ + * indent-tabs-mode: t + * c-basic-offset: 4 + * tab-width: 4 + * End: + * vim:noexpandtab:sw=4:ts=4: + */