Enhanced SIM for E2AP v1 for TS UC
[sim/e2-interface.git] / e2sim / e2apv1sim / src / ASN1 / asn / ber / tools.hpp
1 #pragma once
2 /******************************************************************************
3 *
4 *   Copyright (c) 2019 AT&T Intellectual Property.
5 *   Copyright (c) 2018-2019 Nokia.
6 *
7 *   Licensed under the Apache License, Version 2.0 (the "License");
8 *   you may not use this file except in compliance with the License.
9 *   You may obtain a copy of the License at
10 *
11 *       http://www.apache.org/licenses/LICENSE-2.0
12 *
13 *   Unless required by applicable law or agreed to in writing, software
14 *   distributed under the License is distributed on an "AS IS" BASIS,
15 *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 *   See the License for the specific language governing permissions and
17 *   limitations under the License.
18 *
19 ******************************************************************************/
20
21 // Standard Includes: ANSI C/C++, MSA, and Third-Party Libraries
22
23 // Local Includes: Application specific classes, functions, and libraries
24
25 namespace asn {
26 namespace ber {
27
28 struct Tools
29 {
30         typedef bit_accessor_cross_byte<false> bit_accessor;
31
32
33         template<typename T>
34         static void put_bytes(T value, size_t length, EncoderCtx& ctx)
35         {
36                 auto & buffer = ctx.refBuffer();
37                 
38                 size_t shift = (length - 1) << 3;
39                 for(size_t i = 0; i < length; ++i)
40                 {
41                         buffer.putByte(static_cast<uint8_t>(value >> shift));
42                         shift -= 8;
43                 }
44         }
45         
46         template<typename T>
47         static void get_bytes(T& value, size_t length, DecoderCtx& ctx)
48         {
49                 auto & buffer = ctx.refBuffer();
50                 
51                 value = 0;
52                 uint8_t const* data = buffer.getBytes(length);
53                 
54                 if(data)
55                 {
56                         value = data[0];
57                         for(size_t i = 1; i < length; ++i)
58                         {
59                                 value <<= 8;
60                                 value |= data[i];
61                         }
62                 }
63         }
64
65 };
66
67 } //namespace ber
68 } //namespace asn