mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-05-13 21:40:41 +00:00
768e812e45
* On windows it's strongly desired to be able to compile straight out of a clean checkout or source download. This means anyone can download the source and investigate something quickly, without having to worry about the hassle of figuring out how the project downloads 3rd party dependencies, fetching them, getting them registered in the right place. * This can't be put in a submodule as git submodules don't get downloaded by default so people new to git will get confusing compilation messages, and someone downloading the source from github directly without cloning via git won't get submodules included. * It does add some extra size to a fresh download/checkout which is unfortunate, but absolutely worth the cost. Shallow checkouts still aren't unfeasibly large, and it's only a one-off cost at clone time.
92 lines
3.6 KiB
OpenEdge ABL
92 lines
3.6 KiB
OpenEdge ABL
/*
|
|
std::array
|
|
*/
|
|
|
|
%fragment("StdArrayTraits","header",fragment="StdSequenceTraits")
|
|
%{
|
|
namespace swig {
|
|
template <class T, size_t N>
|
|
struct traits_asptr<std::array<T, N> > {
|
|
static int asptr(PyObject *obj, std::array<T, N> **vec) {
|
|
return traits_asptr_stdseq<std::array<T, N> >::asptr(obj, vec);
|
|
}
|
|
};
|
|
|
|
template <class T, size_t N>
|
|
struct traits_from<std::array<T, N> > {
|
|
static PyObject *from(const std::array<T, N>& vec) {
|
|
return traits_from_stdseq<std::array<T, N> >::from(vec);
|
|
}
|
|
};
|
|
|
|
template <class SwigPySeq, class T, size_t N>
|
|
inline void
|
|
assign(const SwigPySeq& swigpyseq, std::array<T, N>* seq) {
|
|
if (swigpyseq.size() < seq->size())
|
|
throw std::invalid_argument("std::array cannot be expanded in size");
|
|
else if (swigpyseq.size() > seq->size())
|
|
throw std::invalid_argument("std::array cannot be reduced in size");
|
|
std::copy(swigpyseq.begin(), swigpyseq.end(), seq->begin());
|
|
}
|
|
|
|
template <class T, size_t N>
|
|
inline void
|
|
erase(std::array<T, N>* SWIGUNUSEDPARM(seq), const typename std::array<T, N>::iterator& SWIGUNUSEDPARM(position)) {
|
|
throw std::invalid_argument("std::array object does not support item deletion");
|
|
}
|
|
|
|
// Only limited slicing is supported as std::array is fixed in size
|
|
template <class T, size_t N, class Difference>
|
|
inline std::array<T, N>*
|
|
getslice(const std::array<T, N>* self, Difference i, Difference j, Py_ssize_t step) {
|
|
typedef std::array<T, N> Sequence;
|
|
typename Sequence::size_type size = self->size();
|
|
Difference ii = 0;
|
|
Difference jj = 0;
|
|
swig::slice_adjust(i, j, step, size, ii, jj);
|
|
|
|
if (step == 1 && ii == 0 && static_cast<typename Sequence::size_type>(jj) == size) {
|
|
Sequence *sequence = new Sequence();
|
|
std::copy(self->begin(), self->end(), sequence->begin());
|
|
return sequence;
|
|
} else if (step == -1 && static_cast<typename Sequence::size_type>(ii) == (size - 1) && jj == -1) {
|
|
Sequence *sequence = new Sequence();
|
|
std::copy(self->rbegin(), self->rend(), sequence->begin());
|
|
return sequence;
|
|
} else {
|
|
throw std::invalid_argument("std::array object only supports getting a slice that is the size of the array");
|
|
}
|
|
}
|
|
|
|
template <class T, size_t N, class Difference, class InputSeq>
|
|
inline void
|
|
setslice(std::array<T, N>* self, Difference i, Difference j, Py_ssize_t step, const InputSeq& is = InputSeq()) {
|
|
typedef std::array<T, N> Sequence;
|
|
typename Sequence::size_type size = self->size();
|
|
Difference ii = 0;
|
|
Difference jj = 0;
|
|
swig::slice_adjust(i, j, step, size, ii, jj, true);
|
|
|
|
if (step == 1 && ii == 0 && static_cast<typename Sequence::size_type>(jj) == size) {
|
|
std::copy(is.begin(), is.end(), self->begin());
|
|
} else if (step == -1 && static_cast<typename Sequence::size_type>(ii) == (size - 1) && jj == -1) {
|
|
std::copy(is.rbegin(), is.rend(), self->begin());
|
|
} else {
|
|
throw std::invalid_argument("std::array object only supports setting a slice that is the size of the array");
|
|
}
|
|
}
|
|
|
|
template <class T, size_t N, class Difference>
|
|
inline void
|
|
delslice(std::array<T, N>* SWIGUNUSEDPARM(self), Difference SWIGUNUSEDPARM(i), Difference SWIGUNUSEDPARM(j), Py_ssize_t SWIGUNUSEDPARM(step)) {
|
|
throw std::invalid_argument("std::array object does not support item deletion");
|
|
}
|
|
}
|
|
%}
|
|
|
|
#define %swig_array_methods(Type...) %swig_sequence_methods_non_resizable(Type)
|
|
#define %swig_array_methods_val(Type...) %swig_sequence_methods_non_resizable_val(Type);
|
|
|
|
%include <std/std_array.i>
|
|
|