Skip to content

Commit

Permalink
implement gd::set for android (#1197)
Browse files Browse the repository at this point in the history
* add gnu set headers

* add missing include

* fix stl namespace

* Update stl_iterator_base_types.h
  • Loading branch information
Prevter authored Jan 2, 2025
1 parent 2545003 commit 0a25ebd
Show file tree
Hide file tree
Showing 14 changed files with 7,319 additions and 5 deletions.
8 changes: 3 additions & 5 deletions loader/include/Geode/c++stl/gnustl.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ namespace geode::base {
#if defined(GEODE_IS_ANDROID)

#include "gnustl-map.hpp"
#include "gnustl/stl_set.h"
#include "gnustl/unordered_map.hpp"
#include "gnustl/unordered_set.hpp"
#include "gnustl/hash_specialization.hpp"
Expand Down Expand Up @@ -686,11 +687,8 @@ namespace gd {
}
};

// 2.2 TODO: Implement set, unordered_map and unordered_set

// the sizes of these are always the same, no matter the type
template <class V>
using set = void*[6];
template<typename Key, typename Compare = geode::stl::less<Key>, typename Alloc = std::allocator<Key>>
using set = geode::stl::set<Key, Compare, Alloc>;

template <class Key, class Tp, class Hash = geode::stl::hash<Key>, class Pred = geode::stl::equal_to<Key>, class Alloc = std::allocator<std::pair<const Key, Tp>>>
using unordered_map = geode::stl::unordered_map<Key, Tp, Hash, Pred, Alloc>;
Expand Down
7 changes: 7 additions & 0 deletions loader/include/Geode/c++stl/gnustl/c++config.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,14 @@
# include "c++config-armeabi-v7a.h"
#endif

#define _GLIBCXX_NODISCARD __attribute__ ((__warn_unused_result__))
#define _GLIBCXX20_CONSTEXPR constexpr
#define _GLIBCXX17_CONSTEXPR constexpr
#define _GLIBCXX_NOEXCEPT_IF(...) noexcept(__VA_ARGS__)

// i put this here cuz it's used all over the place
namespace geode::stl {
template <typename T> using __not_ = std::integral_constant<bool, !T::value>;
template <typename... T> using __or_ = std::disjunction<T...>;
template <typename... T> using __and_ = std::conjunction<T...>;
}
80 changes: 80 additions & 0 deletions loader/include/Geode/c++stl/gnustl/concept_check.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
// Concept-checking control -*- C++ -*-

// Copyright (C) 2001-2014 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library 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, or (at your option)
// any later version.

// This library 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.

// Under Section 7 of GPL version 3, you are granted additional
// permissions described in the GCC Runtime Library Exception, version
// 3.1, as published by the Free Software Foundation.

// You should have received a copy of the GNU General Public License and
// a copy of the GCC Runtime Library Exception along with this program;
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
// <http://www.gnu.org/licenses/>.

/** @file bits/concept_check.h
* This is an internal header file, included by other library headers.
* Do not attempt to use it directly. @headername{iterator}
*/

#ifndef _CONCEPT_CHECK_H
#define _CONCEPT_CHECK_H 1

#pragma GCC system_header

#include "c++config.h"

// All places in libstdc++-v3 where these are used, or /might/ be used, or
// don't need to be used, or perhaps /should/ be used, are commented with
// "concept requirements" (and maybe some more text). So grep like crazy
// if you're looking for additional places to use these.

// Concept-checking code is off by default unless users turn it on via
// configure options or editing c++config.h.

#ifndef _GLIBCXX_CONCEPT_CHECKS

#define __glibcxx_function_requires(...)
#define __glibcxx_class_requires(_a,_b)
#define __glibcxx_class_requires2(_a,_b,_c)
#define __glibcxx_class_requires3(_a,_b,_c,_d)
#define __glibcxx_class_requires4(_a,_b,_c,_d,_e)

#else // the checks are on

#include "boost_concept_check.h"

// Note that the obvious and elegant approach of
//
//#define glibcxx_function_requires(C) debug::function_requires< debug::C >()
//
// won't work due to concept templates with more than one parameter, e.g.,
// BinaryPredicateConcept. The preprocessor tries to split things up on
// the commas in the template argument list. We can't use an inner pair of
// parenthesis to hide the commas, because "debug::(Temp<Foo,Bar>)" isn't
// a valid instantiation pattern. Thus, we steal a feature from C99.

#define __glibcxx_function_requires(...) \
__gnu_cxx::__function_requires< __gnu_cxx::__VA_ARGS__ >();
#define __glibcxx_class_requires(_a,_C) \
_GLIBCXX_CLASS_REQUIRES(_a, __gnu_cxx, _C);
#define __glibcxx_class_requires2(_a,_b,_C) \
_GLIBCXX_CLASS_REQUIRES2(_a, _b, __gnu_cxx, _C);
#define __glibcxx_class_requires3(_a,_b,_c,_C) \
_GLIBCXX_CLASS_REQUIRES3(_a, _b, _c, __gnu_cxx, _C);
#define __glibcxx_class_requires4(_a,_b,_c,_d,_C) \
_GLIBCXX_CLASS_REQUIRES4(_a, _b, _c, _d, __gnu_cxx, _C);

#endif // enable/disable

#endif // _GLIBCXX_CONCEPT_CHECK
Loading

0 comments on commit 0a25ebd

Please sign in to comment.