>From 0314e51d0fcfb9d96d4b0868f085d5f811300b46 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Sun, 2 Feb 2020 19:07:17 +0100 Subject: [PATCH 09/11] omap-c++: New module. * lib/gl_omap.hh: New file, based on lib/gl_omap.h. * modules/omap-c++: New file. --- ChangeLog | 6 ++ lib/gl_omap.hh | 182 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ modules/omap-c++ | 21 +++++++ 3 files changed, 209 insertions(+) create mode 100644 lib/gl_omap.hh create mode 100644 modules/omap-c++ diff --git a/ChangeLog b/ChangeLog index a894f10..3b2616e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2020-02-02 Bruno Haible + omap-c++: New module. + * lib/gl_omap.hh: New file, based on lib/gl_omap.h. + * modules/omap-c++: New file. + +2020-02-02 Bruno Haible + map-c++: Add tests. * tests/test-map-c++.cc: New file. * modules/map-c++-tests: New file. diff --git a/lib/gl_omap.hh b/lib/gl_omap.hh new file mode 100644 index 0000000..15d8104 --- /dev/null +++ b/lib/gl_omap.hh @@ -0,0 +1,182 @@ +/* Abstract ordered map data type as a C++ class. + Copyright (C) 2006-2020 Free Software Foundation, Inc. + Written by Bruno Haible , 2018. + + 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_OMAP_HH +#define _GL_OMAP_HH + +#include "gl_omap.h" +#include "gl_xomap.h" + +/* gl_OMap is a C++ wrapper around the gl_omap data type. + Its key type is 'KEYTYPE *'. Its value type is 'VALUETYPE *'. + + 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_OMap; + +template +class gl_OMap +{ +public: + // ------------------------------ Constructors ------------------------------ + + gl_OMap () + : _ptr (NULL) + {} + + /* Creates an empty map. + IMPLEMENTATION is one of GL_ARRAY_OMAP, GL_AVLTREE_OMAP, GL_RBTREE_OMAP. + COMPAR_FN is a key comparison function or NULL. + KDISPOSE_FN is a key disposal function or NULL. + VDISPOSE_FN is a value disposal function or NULL. */ + gl_OMap (gl_omap_implementation_t implementation, + int (*compar_fn) (KEYTYPE * /*key1*/, KEYTYPE * /*key2*/), + void (*kdispose_fn) (KEYTYPE *), + void (*vdispose_fn) (VALUETYPE *)) + : _ptr (gl_omap_create_empty (implementation, + reinterpret_cast(compar_fn), + reinterpret_cast(kdispose_fn), + reinterpret_cast(vdispose_fn))) + {} + + /* Copy constructor. */ + gl_OMap (const gl_OMap& x) + { _ptr = x._ptr; } + + /* Assignment operator. */ + gl_OMap& operator= (const gl_OMap& x) + { _ptr = x._ptr; return *this; } + + // ------------------------------- Destructor ------------------------------- + + ~gl_OMap () + { _ptr = NULL; } + + // ----------------------- Read-only member functions ----------------------- + + /* Returns the current number of pairs in the ordered map. */ + size_t size () const + { return gl_omap_size (_ptr); } + + /* Searches whether a pair with the given key is already in the ordered map. + Returns the value if found, or NULL if not present in the map. */ + VALUETYPE * get (KEYTYPE * key) const + { return static_cast(gl_omap_get (_ptr, key)); } + + /* Searches whether a pair with the given key is already in the ordered map. + Returns true and sets VALUE to the value if found. + Returns false if not present in the map. */ + bool search (KEYTYPE * key, VALUETYPE *& value) const + { return gl_omap_search (_ptr, key, &value); } + + /* Searches the pair with the least key in the ordered map that compares + greater or equal to the given THRESHOLD. The representation of the + THRESHOLD is defined by the THRESHOLD_FN. + Returns true and stores the found pair in KEY and VALUE if found. + Otherwise returns false. */ + bool search_atleast (bool (*threshold_fn) (KEYTYPE * /*key*/, KEYTYPE * /*threshold*/), + KEYTYPE * threshold, + KEYTYPE *& key, VALUETYPE *& value) const + { return gl_omap_search_atleast (_ptr, reinterpret_cast(threshold_fn), threshold, &key, &value); } + + // ----------------------- Modifying member functions ----------------------- + + /* Adds a pair to the ordered map. + Returns true if a pair with the given key was not already in the map and so + this pair was added. + Returns false if a pair with the given key was already in the map and only + its value was replaced. */ + bool put (KEYTYPE * key, VALUETYPE * value) + { return gl_omap_put (_ptr, key, value); } + + /* Adds a pair to the ordered map and retrieves the previous value. + Returns true if a pair with the given key was not already in the map and so + this pair was added. + Returns false and sets OLDVALUE to the previous value, if a pair with the + given key was already in the map and only its value was replaced. */ + bool getput (KEYTYPE * key, VALUETYPE * value, VALUETYPE *& oldvalue) + { return gl_omap_getput (_ptr, key, value, &oldvalue); } + + /* Removes a pair from the ordered map. + Returns true if the key was found and its pair removed. + Returns false otherwise. */ + bool remove (KEYTYPE * key) + { return gl_omap_remove (_ptr, key); } + + /* Removes a pair from the ordered map and retrieves the previous value. + Returns true and sets OLDVALUE to the previous value, if the key was found + and its pair removed. + Returns false otherwise. */ + bool getremove (KEYTYPE * key, VALUETYPE *& oldvalue) + { return gl_omap_getremove (_ptr, key, &oldvalue); } + + /* Frees the entire ordered map. + (But this call does not free the keys and values of the pairs in the map. + It only invokes the KDISPOSE_FN on each key and the VDISPOSE_FN on each value + of the pairs in the map.) */ + void free () + { gl_omap_free (_ptr); _ptr = NULL; } + + // ------------------------------ Private stuff ------------------------------ + +private: + gl_omap_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 pair, stores the next pair in KEY and VALUE, advances + the iterator, and returns true. Otherwise, returns false. */ + bool next (KEYTYPE *& key, VALUETYPE *& value) + { return gl_omap_iterator_next (&_state, reinterpret_cast(&key), reinterpret_cast(&value)); } + + ~iterator () + { gl_omap_iterator_free (&_state); } + + #if defined __xlC__ || defined __HP_aCC || defined __SUNPRO_CC + public: + #else + private: + friend iterator gl_OMap::begin (); + #endif + + iterator (gl_omap_t ptr) + : _state (gl_omap_iterator (ptr)) + {} + + private: + + gl_omap_iterator_t _state; + }; + + /* Creates an iterator traversing the ordered map. + The map's contents must not be modified while the iterator is in use, + except for modifying the value of the last returned key or removing the + last returned pair. */ + iterator begin () + { return iterator (_ptr); } +}; + +#endif /* _GL_OMAP_HH */ diff --git a/modules/omap-c++ b/modules/omap-c++ new file mode 100644 index 0000000..ce1609a --- /dev/null +++ b/modules/omap-c++ @@ -0,0 +1,21 @@ +Description: +Abstract ordered map data type as a C++ class. + +Files: +lib/gl_omap.hh + +Depends-on: +xomap + +configure.ac: + +Makefile.am: + +Include: +"gl_omap.hh" + +License: +GPL + +Maintainer: +all -- 2.7.4