lime
Lime is a C++ library implementing Open Whisper System Signal protocol
Loading...
Searching...
No Matches
arraylike.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <type_traits>
4#include <string>
5#include <array>
6#include <vector>
7
8namespace jni
9 {
10 template < class T > struct IsArraylike: std::false_type {};
11
12 template < class E, std::size_t n > struct IsArraylike< E[n] > : std::true_type {};
13 template < class E, std::size_t n > struct IsArraylike< std::array<E,n> > : std::true_type {};
14 template < class E, class A > struct IsArraylike< std::vector<E,A> > : std::true_type {};
15 template < class C, class T, class A > struct IsArraylike< std::basic_string<C,T,A> > : std::true_type {};
16
17
18 template < class T > struct ArraylikeElementType;
19
20 template < class E, std::size_t n > struct ArraylikeElementType< E[n] > { using Type = E; };
21 template < class E, std::size_t n > struct ArraylikeElementType< std::array<E,n> > { using Type = E; };
22 template < class E, class A > struct ArraylikeElementType< std::vector<E,A> > { using Type = E; };
23 template < class C, class T, class A > struct ArraylikeElementType< std::basic_string<C,T,A> > { using Type = C; };
24
25 template < class T > using ArraylikeElement = typename ArraylikeElementType<T>::type;
26
27
28 template < class E, std::size_t n > E * ArraylikeData(E(&a)[n]) { return a; }
29 template < class E, std::size_t n > E * ArraylikeData( std::array<E,n>& a) { return a.data(); }
30 template < class E, std::size_t n > E const * ArraylikeData(const std::array<E,n>& a) { return a.data(); }
31 template < class E, class A > E * ArraylikeData( std::vector<E,A>& a) { return a.data(); }
32 template < class E, class A > E const * ArraylikeData(const std::vector<E,A>& a) { return a.data(); }
33 template < class C, class T, class A > C * ArraylikeData( std::basic_string<C,T,A>& a) { return &a[0]; }
34 template < class C, class T, class A > C const * ArraylikeData(const std::basic_string<C,T,A>& a) { return &a[0]; }
35
36
37 template < class E, std::size_t n > std::size_t ArraylikeSize(E(&)[n]) { return n; }
38 template < class E, std::size_t n > std::size_t ArraylikeSize(const std::array<E,n>&) { return n; }
39 template < class E, class A > std::size_t ArraylikeSize(const std::vector<E,A>& a) { return a.size(); }
40 template < class C, class T, class A > std::size_t ArraylikeSize(const std::basic_string<C,T,A>& a) { return a.size(); }
41 }
Definition advanced_ownership.hpp:6
typename ArraylikeElementType< T >::type ArraylikeElement
Definition arraylike.hpp:25
jarray< E > & NewArray(JNIEnv &env, jsize length)
Definition functions.hpp:472
std::size_t ArraylikeSize(E(&)[n])
Definition arraylike.hpp:37
E * ArraylikeData(E(&a)[n])
Definition arraylike.hpp:28
Definition errors.hpp:10
E Type
Definition arraylike.hpp:20
Definition arraylike.hpp:18
Definition arraylike.hpp:10