Subversion Repositories Games.Descent

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1 pmbaty 1
/*
2
 * This file is part of the DXX-Rebirth project <https://www.dxx-rebirth.com/>.
3
 * It is copyright by its individual contributors, as recorded in the
4
 * project's Git history.  See COPYING.txt at the top level for license
5
 * terms and a link to the Git history.
6
 */
7
 
8
#pragma once
9
#include <physfs.h>
10
 
11
typedef char file_extension_t[5];
12
 
13
#ifdef __cplusplus
14
#include <cstdint>
15
#include <memory>
16
#include "null_sentinel_iterator.h"
17
 
18
#include "dxxsconf.h"
19
#include "dsx-ns.h"
20
#include "fwd-partial_range.h"
21
#include <array>
22
 
23
namespace dcx {
24
 
25
class PHYSFS_list_deleter
26
{
27
public:
28
        void operator()(char **list) const
29
        {
30
                PHYSFS_freeList(list);
31
        }
32
};
33
 
34
template <typename D>
35
class PHYSFSX_uncounted_list_template : public std::unique_ptr<char *[], D>
36
{
37
public:
38
        typedef null_sentinel_iterator<char *> const_iterator;
39
        DXX_INHERIT_CONSTRUCTORS(PHYSFSX_uncounted_list_template, std::unique_ptr<char *[], D>);
40
        const_iterator begin() const
41
        {
42
                return this->get();
43
        }
44
        const_iterator end() const
45
        {
46
                return {};
47
        }
48
};
49
 
50
template <typename D>
51
class PHYSFSX_counted_list_template : public PHYSFSX_uncounted_list_template<D>
52
{
53
        typedef PHYSFSX_uncounted_list_template<D> base_ptr;
54
        using typename base_ptr::pointer;
55
        uint_fast32_t count = 0;
56
public:
57
        using base_ptr::base_ptr;
58
        uint_fast32_t get_count() const
59
        {
60
                return count;
61
        }
62
        void set_count(uint_fast32_t c)
63
        {
64
                count = c;
65
        }
66
        void reset()
67
        {
68
                base_ptr::reset();
69
        }
70
        void reset(pointer p)
71
        {
72
                count = 0;
73
                base_ptr::reset(p);
74
        }
75
};
76
 
77
typedef PHYSFSX_uncounted_list_template<PHYSFS_list_deleter> PHYSFSX_uncounted_list;
78
typedef PHYSFSX_counted_list_template<PHYSFS_list_deleter> PHYSFSX_counted_list;
79
 
80
__attribute_nonnull()
81
__attribute_warn_unused_result
82
PHYSFSX_uncounted_list PHYSFSX_findFiles(const char *path, partial_range_t<const file_extension_t *> exts);
83
 
84
__attribute_nonnull()
85
__attribute_warn_unused_result
86
PHYSFSX_uncounted_list PHYSFSX_findabsoluteFiles(const char *path, const char *realpath, const partial_range_t<const file_extension_t *> exts);
87
 
88
}
89
#endif