1 /*
2  *
3  * Copyright 2019, The Android Open Source Project
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 
18 #ifndef TEEUI_STATIC_VEC_H_
19 #define TEEUI_STATIC_VEC_H_
20 
21 #include <stddef.h>  // for size_t
22 
23 #ifdef TEEUI_USE_STD_VECTOR
24 #include <vector>
25 #endif
26 
27 namespace teeui {
28 
29 /**
30  * teeui::static_vec leads a double life.
31  *
32  * When compiling with TEEUI_USE_STD_VECTOR it is just an alias for std::vector. HAL services using
33  * this library must use this option for safe handling of message buffers.
34  *
35  * When compiling without TEEUI_USE_STD_VECTOR this class works more like a span that does not
36  * actually own the buffer if wraps. This is the behavior expected by generic_operation.h, which
37  * is used inside a heap-less implementation of a confirmationui trusted app.
38  */
39 #ifndef TEEUI_USE_STD_VECTOR
40 template <typename T> class static_vec {
41   private:
42     T* data_;
43     size_t size_;
44 
45   public:
static_vec()46     static_vec() : data_(nullptr), size_(0) {}
static_vec(T * begin,T * end)47     static_vec(T* begin, T* end) : data_(begin), size_(end - begin) {}
static_vec(T (& arr)[s])48     template <size_t s> static_vec(T (&arr)[s]) : data_(&arr[0]), size_(s) {}
49     static_vec(const static_vec&) = default;
50     static_vec(static_vec&&) = default;
51     static_vec& operator=(const static_vec&) = default;
52     static_vec& operator=(static_vec&&) = default;
53 
data()54     T* data() { return data_; }
data()55     const T* data() const { return data_; }
size()56     size_t size() const { return size_; }
57 
begin()58     T* begin() { return data_; }
end()59     T* end() { return data_ + size_; }
begin()60     const T* begin() const { return data_; }
end()61     const T* end() const { return data_ + size_; }
62 };
63 #else
64 template <typename T> using static_vec = std::vector<T>;
65 #endif
66 
67 }  // namespace teeui
68 
69 #endif  // TEEUI_STATIC_VEC_H_
70