blob: 507b36912ea44243eee831a4347c19da259cdc3f [file] [log] [blame]
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
#ifndef KUDU_CONSENSUS_OPID_UTIL_H_
#define KUDU_CONSENSUS_OPID_UTIL_H_
#include <cstddef>
#include <cstdint>
#include <iosfwd>
#include <string>
namespace kudu {
namespace consensus {
class ConsensusRequestPB;
class OpId;
// Minimum possible term.
extern const int64_t kMinimumTerm;
// Minimum possible log index.
extern const int64_t kMinimumOpIdIndex;
// Log index that is lower than the minimum index (and so will never occur).
extern const int64_t kInvalidOpIdIndex;
// Returns true iff left == right.
bool OpIdEquals(const OpId& left, const OpId& right);
// Returns true iff left < right.
bool OpIdLessThan(const OpId& left, const OpId& right);
// Returns true iff left > right.
bool OpIdBiggerThan(const OpId& left, const OpId& right);
// Copies to_compare into target under the following conditions:
// - If to_compare is initialized and target is not.
// - If they are both initialized and to_compare is less than target.
// Otherwise, does nothing.
// If to_compare is copied into target, returns true, else false.
bool CopyIfOpIdLessThan(const OpId& to_compare, OpId* target);
// Return -1 if left < right,
// 0 if equal,
// 1 if left > right.
int OpIdCompare(const OpId& left, const OpId& right);
// OpId hash functor. Suitable for use with std::unordered_map.
struct OpIdHashFunctor {
size_t operator() (const OpId& id) const;
};
// OpId equals functor. Suitable for use with std::unordered_map.
struct OpIdEqualsFunctor {
bool operator() (const OpId& left, const OpId& right) const;
};
// OpId less than functor for pointers.. Suitable for use with std::sort and std::map.
struct OpIdLessThanPtrFunctor {
// Returns true iff left < right.
bool operator() (const OpId* left, const OpId* right) const;
};
// Sorts op id's by index only, disregarding the term.
struct OpIdIndexLessThanPtrFunctor {
// Returns true iff left.index() < right.index().
bool operator() (const OpId* left, const OpId* right) const;
};
// OpId compare() functor. Suitable for use with std::sort and std::map.
struct OpIdCompareFunctor {
// Returns true iff left < right.
bool operator() (const OpId& left, const OpId& right) const;
};
// OpId comparison functor that returns true iff left > right. Suitable for use
// with std::sort and std::map to sort keys in increasing order.
struct OpIdBiggerThanFunctor {
bool operator() (const OpId& left, const OpId& right) const;
};
std::ostream& operator<<(std::ostream& os, const consensus::OpId& op_id);
// Return the minimum possible OpId.
OpId MinimumOpId();
// Return the maximum possible OpId.
OpId MaximumOpId();
std::string OpIdToString(const OpId& id);
std::string OpsRangeString(const ConsensusRequestPB& req);
OpId MakeOpId(int64_t term, int64_t index);
} // namespace consensus
} // namespace kudu
#endif /* KUDU_CONSENSUS_OPID_UTIL_H_ */