1 // Copyright (c) 2019 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "quiche/quic/core/qpack/qpack_index_conversions.h"
6
7 #include <limits>
8
9 #include "quiche/quic/platform/api/quic_logging.h"
10
11 namespace quic {
12
QpackAbsoluteIndexToEncoderStreamRelativeIndex(uint64_t absolute_index,uint64_t inserted_entry_count)13 uint64_t QpackAbsoluteIndexToEncoderStreamRelativeIndex(
14 uint64_t absolute_index, uint64_t inserted_entry_count) {
15 QUICHE_DCHECK_LT(absolute_index, inserted_entry_count);
16
17 return inserted_entry_count - absolute_index - 1;
18 }
19
QpackAbsoluteIndexToRequestStreamRelativeIndex(uint64_t absolute_index,uint64_t base)20 uint64_t QpackAbsoluteIndexToRequestStreamRelativeIndex(uint64_t absolute_index,
21 uint64_t base) {
22 QUICHE_DCHECK_LT(absolute_index, base);
23
24 return base - absolute_index - 1;
25 }
26
QpackEncoderStreamRelativeIndexToAbsoluteIndex(uint64_t relative_index,uint64_t inserted_entry_count,uint64_t * absolute_index)27 bool QpackEncoderStreamRelativeIndexToAbsoluteIndex(
28 uint64_t relative_index, uint64_t inserted_entry_count,
29 uint64_t* absolute_index) {
30 if (relative_index >= inserted_entry_count) {
31 return false;
32 }
33
34 *absolute_index = inserted_entry_count - relative_index - 1;
35 return true;
36 }
37
QpackRequestStreamRelativeIndexToAbsoluteIndex(uint64_t relative_index,uint64_t base,uint64_t * absolute_index)38 bool QpackRequestStreamRelativeIndexToAbsoluteIndex(uint64_t relative_index,
39 uint64_t base,
40 uint64_t* absolute_index) {
41 if (relative_index >= base) {
42 return false;
43 }
44
45 *absolute_index = base - relative_index - 1;
46 return true;
47 }
48
QpackPostBaseIndexToAbsoluteIndex(uint64_t post_base_index,uint64_t base,uint64_t * absolute_index)49 bool QpackPostBaseIndexToAbsoluteIndex(uint64_t post_base_index, uint64_t base,
50 uint64_t* absolute_index) {
51 if (post_base_index >= std::numeric_limits<uint64_t>::max() - base) {
52 return false;
53 }
54
55 *absolute_index = base + post_base_index;
56 return true;
57 }
58
59 } // namespace quic
60