diff options
author | Wohlstand <admin@wohlnet.ru> | 2017-11-13 04:52:25 +0300 |
---|---|---|
committer | Wohlstand <admin@wohlnet.ru> | 2017-11-13 04:52:25 +0300 |
commit | 9352de797b9f2bceb77a7dfb0229c01f0ac1cd0d (patch) | |
tree | 82aad257a3e9c0ae03cdee4e9b867eb42e92bffd /cmake/openwattcom-dos/custom-h | |
parent | b043032a89f38e2b3191a65dab9ae4e8202d48f3 (diff) | |
download | libADLMIDI-9352de797b9f2bceb77a7dfb0229c01f0ac1cd0d.tar.gz libADLMIDI-9352de797b9f2bceb77a7dfb0229c01f0ac1cd0d.tar.bz2 libADLMIDI-9352de797b9f2bceb77a7dfb0229c01f0ac1cd0d.zip |
Continue attempt to make library and demo player runnable under OpenWatcom
Because of broken STL containers, are very hard crashes in random places are can't be fixed with a full customizing of those containers.
Diffstat (limited to 'cmake/openwattcom-dos/custom-h')
-rw-r--r-- | cmake/openwattcom-dos/custom-h/mymap.h | 140 | ||||
-rw-r--r-- | cmake/openwattcom-dos/custom-h/myset.h | 90 |
2 files changed, 230 insertions, 0 deletions
diff --git a/cmake/openwattcom-dos/custom-h/mymap.h b/cmake/openwattcom-dos/custom-h/mymap.h new file mode 100644 index 0000000..560621e --- /dev/null +++ b/cmake/openwattcom-dos/custom-h/mymap.h @@ -0,0 +1,140 @@ +/* +PtrList - A custom STD::Vector implementation. Workaround for OpenWatcom's crashing implementation + +Copyright (c) 2017 Vitaliy Novichkov <admin@wohlnet.ru> + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +*/ + +#ifndef MYMAP_H +#define MYMAP_H + +#include <vector> +#include <utility> +#include <cstdio> + +//WORKAROUND: use custom std::map implementation to avoid lots of crashes!!! +#define _MAP_INCLUDED + +namespace std +{ + +template<class Key, + class Type, + class Allocator = allocator< pair<Key, Type > >, + class Implementation = vector< pair<Key, Type >, Allocator> > +class map : public Implementation +{ +public: + map() : Implementation() {} + ~map() {} + + iterator find(const Key& val) + { + std::printf("std::map find\r\n"); + std::fflush(stdout); + + for(iterator it = begin(); it != end(); it++) + { + if(val == it->first) + return it; + } + return end(); + } + + map& operator=( map const & x ) + { + std::printf("std::map operator=\r\n"); + std::fflush(stdout); + + Implementation::operator=( x ); return( *this ); + } + + Type& operator[](const Key &key) + { + std::printf("std::map operator[]\r\n"); + std::fflush(stdout); + + for(iterator it = begin(); it != end(); it++) + { + if(key == it->first) + return it->second; + } + return Implementation::insert(end(), pair<Key, Type>(key, Type()))->second; + } + + pair<iterator, bool> insert(const pair<Key, Type> &val) + { + std::printf("std::map insert\r\n"); + std::fflush(stdout); + + bool found = false; + iterator f = find(val.first); + if(f != end()) + { + f->second = val.second; + found = true; + } + else + { + f = Implementation::insert(end(), val); + } + return make_pair<iterator, bool>(f, found); + } + + void erase(const iterator& val) + { + std::printf("std::map erase iterator\r\n"); + std::fflush(stdout); + + if(val != end()) + Implementation::erase(val); + } + + void erase(const Key& val) + { + std::printf("std::map erase key\r\n"); + std::fflush(stdout); + + iterator f = find(val); + if(f != end()) + { + Implementation::erase(f); + } + } + + //@{ + /** + * @brief Finds the number of elements. + * @param __x Element to located. + * @return Number of elements with specified key. + * + * This function only makes sense for multisets; for set the result will + * either be 0 (not present) or 1 (present). + */ + size_t + count(const Key& __x) + { + return find(__x) == Implementation::end() ? 0 : 1; + } +}; + +} + +#endif // MYMAP_H diff --git a/cmake/openwattcom-dos/custom-h/myset.h b/cmake/openwattcom-dos/custom-h/myset.h new file mode 100644 index 0000000..c5e581d --- /dev/null +++ b/cmake/openwattcom-dos/custom-h/myset.h @@ -0,0 +1,90 @@ +/* +PtrList - A custom STD::Vector implementation. Workaround for OpenWatcom's crashing implementation + +Copyright (c) 2017 Vitaliy Novichkov <admin@wohlnet.ru> + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +*/ + +#ifndef MYSET_H +#define MYSET_H + +#include <vector> + +//WORKAROUND: use custom vector implementation to avoid lots of crashes!!! +#define _SET_INCLUDED +//#define set MySet + +namespace std +{ + +template<class T, class Allocator = allocator< T >, class Implementation = vector<T, Allocator> > +class set : public Implementation +{ +public: + set() : Implementation() {} + ~set() {} + + iterator find(const T& val) + { + for(iterator it = begin(); it != end(); it++) + { + if(val == *it) + return it; + } + return end(); + } + + void insert (const T& val) + { + iterator f = find(val); + if(f != end()) + { + Implementation::insert(end(), val); + } + } + + void erase(const T& val) + { + iterator f = find(val); + if(f != end()) + { + Implementation::erase(f); + } + } + + //@{ + /** + * @brief Finds the number of elements. + * @param __x Element to located. + * @return Number of elements with specified key. + * + * This function only makes sense for multisets; for set the result will + * either be 0 (not present) or 1 (present). + */ + size_t + count(const T& __x) + { + return find(__x) == Implementation::end() ? 0 : 1; + } +}; + +} + +#endif // MYSET_H |