>From ba3d925c185958eaeddf67945c1f4a107de4ecff Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Sun, 2 Feb 2020 19:03:39 +0100 Subject: [PATCH 05/11] oset-c++: New module. * lib/gl_oset.hh: New file, based on lib/gl_oset.h. * modules/oset-c++: New file. --- ChangeLog | 6 +++ lib/gl_oset.hh | 152 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ modules/oset-c++ | 21 ++++++++ 3 files changed, 179 insertions(+) create mode 100644 lib/gl_oset.hh create mode 100644 modules/oset-c++ diff --git a/ChangeLog b/ChangeLog index 2d53bde..d219e03 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2020-02-02 Bruno Haible + oset-c++: New module. + * lib/gl_oset.hh: New file, based on lib/gl_oset.h. + * modules/oset-c++: New file. + +2020-02-02 Bruno Haible + set-c++: Add tests. * tests/test-set-c++.cc: New file. * modules/set-c++-tests: New file. diff --git a/lib/gl_oset.hh b/lib/gl_oset.hh new file mode 100644 index 0000000..16da0dd --- /dev/null +++ b/lib/gl_oset.hh @@ -0,0 +1,152 @@ +/* Abstract ordered set data type as a C++ class. + Copyright (C) 2006-2020 Free Software Foundation, Inc. + Written by Bruno Haible , 2006. + + 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 3 of the License, 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, see . */ + +#ifndef _GL_OSET_HH +#define _GL_OSET_HH + +#include "gl_oset.h" +#include "gl_xoset.h" + +/* gl_OSet is a C++ wrapper around the gl_oset data type. + Its element type is 'ELTYPE *'. + + It is merely a pointer, not a smart pointer. In other words: + it does NOT do reference-counting, and the destructor does nothing. */ + +template class gl_OSet; + +template +class gl_OSet +{ +public: + // ------------------------------ Constructors ------------------------------ + + gl_OSet () + : _ptr (NULL) + {} + + /* Creates an empty set. + IMPLEMENTATION is one of GL_ARRAY_OSET, GL_AVLTREE_OSET, GL_RBTREE_OSET. + COMPAR_FN is an element comparison function or NULL. + DISPOSE_FN is an element disposal function or NULL. */ + gl_OSet (gl_oset_implementation_t implementation, + int (*compar_fn) (ELTYPE * /*elt1*/, ELTYPE * /*elt2*/), + void (*dispose_fn) (ELTYPE *)) + : _ptr (gl_oset_create_empty (implementation, + reinterpret_cast(compar_fn), + reinterpret_cast(dispose_fn))) + {} + + /* Copy constructor. */ + gl_OSet (const gl_OSet& x) + { _ptr = x._ptr; } + + /* Assignment operator. */ + gl_OSet& operator= (const gl_OSet& x) + { _ptr = x._ptr; return *this; } + + // ------------------------------- Destructor ------------------------------- + + ~gl_OSet () + { _ptr = NULL; } + + // ----------------------- Read-only member functions ----------------------- + + /* Returns the current number of elements in the ordered set. */ + size_t size () const + { return gl_oset_size (_ptr); } + + /* Searches whether an element is already in the ordered set. + Returns true if found, or false if not present in the set. */ + bool search (ELTYPE * elt) const + { return gl_oset_search (_ptr, elt); } + + /* Searches the least element in the ordered set that compares greater or equal + to the given THRESHOLD. The representation of the THRESHOLD is defined + by the THRESHOLD_FN. + Returns true and store the found element in ELT if found, otherwise returns + false. */ + bool search_atleast (bool (*threshold_fn) (ELTYPE * /*elt*/, ELTYPE * /*threshold*/), + ELTYPE * threshold, + ELTYPE *& elt) const + { return gl_oset_search_atleast (_ptr, reinterpret_cast(threshold_fn), threshold, &elt); } + + // ----------------------- Modifying member functions ----------------------- + + /* Adds an element to the ordered set. + Returns true if it was not already in the set and added, false otherwise. */ + bool add (ELTYPE * elt) + { return gl_oset_add (_ptr, elt); } + + /* Removes an element from the ordered set. + Returns true if it was found and removed. */ + bool remove (ELTYPE * elt) + { return gl_oset_remove (_ptr, elt); } + + /* Frees the entire ordered set. + (But this call does not free the elements of the set. It only invokes + the DISPOSE_FN on each of the elements of the set.) */ + void free () + { gl_oset_free (_ptr); } + + // ------------------------------ Private stuff ------------------------------ + +private: + gl_oset_t _ptr; + +public: + // -------------------------------- Iterators -------------------------------- + // Only a forward iterator. + // Does not implement the STL operations (++, *, and != .end()), but a simpler + // interface that needs only one virtual function call per iteration instead + // of three. + + class iterator { + public: + + /* If there is a next element, stores the next element in ELT, advances the + iterator and returns true. Otherwise, returns false. */ + bool next (ELTYPE *& elt) + { return gl_oset_iterator_next (&_state, reinterpret_cast(&elt)); } + + ~iterator () + { gl_oset_iterator_free (&_state); } + + #if defined __xlC__ || defined __HP_aCC || defined __SUNPRO_CC + public: + #else + private: + friend iterator gl_OSet::begin (); + #endif + + iterator (gl_oset_t ptr) + : _state (gl_oset_iterator (ptr)) + {} + + private: + + gl_oset_iterator_t _state; + }; + + /* Creates an iterator traversing the ordered set. + The set's contents must not be modified while the iterator is in use, + except for removing the last returned element. */ + iterator begin () + { return iterator (_ptr); } +}; + +#endif /* _GL_OSET_HH */ diff --git a/modules/oset-c++ b/modules/oset-c++ new file mode 100644 index 0000000..18dce2f --- /dev/null +++ b/modules/oset-c++ @@ -0,0 +1,21 @@ +Description: +Abstract ordered set data type as a C++ class. + +Files: +lib/gl_oset.hh + +Depends-on: +xoset + +configure.ac: + +Makefile.am: + +Include: +"gl_oset.hh" + +License: +GPL + +Maintainer: +all -- 2.7.4