lime
Lime is a C++ library implementing Open Whisper System Signal protocol
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 
8 namespace 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  }
typename ArraylikeElementType< T >::type ArraylikeElement
Definition: arraylike.hpp:25
Definition: errors.hpp:9
E * ArraylikeData(E(&a)[n])
Definition: arraylike.hpp:28
Definition: arraylike.hpp:10
Definition: advanced_ownership.hpp:5
std::size_t ArraylikeSize(E(&)[n])
Definition: arraylike.hpp:37
Definition: arraylike.hpp:18
E Type
Definition: arraylike.hpp:20