//  Copyright (c) 2011-present, Facebook, Inc.  All rights reserved.
//  This source code is licensed under both the GPLv2 (found in the
//  COPYING file in the root directory) and Apache 2.0 License
//  (found in the LICENSE.Apache file in the root directory).
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. See the AUTHORS file for names of contributors.

#include "util/coding.h"

namespace doris {
#include "common/compile_check_begin.h"

uint8_t* encode_varint32(uint8_t* dst, uint32_t v) {
    // Operate on characters as unsigneds
    static const int B = 128;
    if (v < (1 << 7)) {
        *(dst++) = uint8_t(v);
    } else if (v < (1 << 14)) {
        *(dst++) = uint8_t(v | B);
        *(dst++) = uint8_t(v >> 7);
    } else if (v < (1 << 21)) {
        *(dst++) = uint8_t(v | B);
        *(dst++) = uint8_t((v >> 7) | B);
        *(dst++) = uint8_t(v >> 14);
    } else if (v < (1 << 28)) {
        *(dst++) = uint8_t(v | B);
        *(dst++) = uint8_t((v >> 7) | B);
        *(dst++) = uint8_t((v >> 14) | B);
        *(dst++) = uint8_t(v >> 21);
    } else {
        *(dst++) = uint8_t(v | B);
        *(dst++) = uint8_t((v >> 7) | B);
        *(dst++) = uint8_t((v >> 14) | B);
        *(dst++) = uint8_t((v >> 21) | B);
        *(dst++) = uint8_t(v >> 28);
    }
    return dst;
}

const uint8_t* decode_varint32_ptr_fallback(const uint8_t* p, const uint8_t* limit,
                                            uint32_t* value) {
    uint32_t result = 0;
    for (uint32_t shift = 0; shift <= 28 && p < limit; shift += 7) {
        uint32_t byte = *p;
        p++;
        if (byte & 128) {
            // More bytes are present
            result |= ((byte & 127) << shift);
        } else {
            result |= (byte << shift);
            *value = result;
            return p;
        }
    }
    return nullptr;
}

const uint8_t* decode_varint64_ptr(const uint8_t* p, const uint8_t* limit, uint64_t* value) {
    uint64_t result = 0;
    for (uint32_t shift = 0; shift <= 63 && p < limit; shift += 7) {
        uint64_t byte = *p;
        p++;
        if (byte & 128) {
            // More bytes are present
            result |= ((byte & 127) << shift);
        } else {
            result |= (byte << shift);
            *value = result;
            return p;
        }
    }
    return nullptr;
}
#include "common/compile_check_end.h"
} // namespace doris
