// Copyright 2012 Google Inc. All Rights Reserved.
//
// Licensed 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 POLO_ENCODING_ENCODINGOPTION_H_
#define POLO_ENCODING_ENCODINGOPTION_H_
#include <stdint.h>
#include <functional>
#include <set>
#include <string>
namespace polo {
namespace encoding {
// An encoding option for a challenge message consisting of an encoding scheme
// and symbol length.
class EncodingOption {
public:
// Representation of a specific encoding type. The numeric values should
// be sorted by encoding complexity from least to greatest.
enum EncodingType {
// Unknown encoding type.
kUnknown = 0,
// Text message composed of characters [0-9].
kNumeric = 1,
// Text message composed of characters [0-9A-Za-z]+.
kAlphaNumeric = 2,
// Text message composed of characters [0-9A-Fa-f]+.
kHexadecimal = 3,
// 2-dimensional barcode, containing binary bitstream.
kQRCode = 4,
};
// Creates a new encoding option.
// @param encoding_type the encoding type
// @param symbol_length the encoding symbole length
EncodingOption(EncodingType encoding_type, uint32_t symbol_length);
// Gets the encoding scheme for the challenge message.
EncodingType encoding_type() const;
// Gets the number of symbols used in the challenge message for the encoding
// type specified by this encoding option. For example, a single symbol for
// hexadecimal encoding consists of 4-bits from the set [0-9A-Fa-f].
uint32_t symbol_length() const;
// Determines whether the given encoding option is the same as this one.
bool Equals(const EncodingOption& other) const;
// Returns a string representation of this encoding option.
std::string ToString() const;
// EncodingOption comparator for set ordering.
struct EncodingOptionComparator : public std::binary_function<
EncodingOption, EncodingOption, bool> {
bool operator()(const EncodingOption& option1,
const EncodingOption& option2) {
// Sort encoding options by complexity.
return (option1.encoding_type() == option2.encoding_type()
&& option1.symbol_length() < option2.symbol_length())
|| (option1.encoding_type() < option2.encoding_type());
}
};
// Predicate for finding an encoding option.
struct EncodingOptionPredicate
: public std::unary_function<EncodingOption, bool> {
const EncodingOption& option_;
explicit EncodingOptionPredicate(const EncodingOption& option)
: option_(option) {}
bool operator()(const EncodingOption& other) const {
return option_.Equals(other);
}
};
// Definition for a set of EncodingOptions that are ordered by complexity.
typedef std::set<EncodingOption, EncodingOptionComparator>
EncodingSet;
private:
EncodingType encoding_type_;
uint32_t symbol_length_;
};
} // namespace encoding
} // namespace polo
#endif // POLO_ENCODING_ENCODINGOPTION_H_