179273b04772824a8c547e1a8d33900040a03264bKeisuke Kuroyanagi/*
279273b04772824a8c547e1a8d33900040a03264bKeisuke Kuroyanagi * Copyright (C) 2014 The Android Open Source Project
379273b04772824a8c547e1a8d33900040a03264bKeisuke Kuroyanagi *
479273b04772824a8c547e1a8d33900040a03264bKeisuke Kuroyanagi * Licensed under the Apache License, Version 2.0 (the "License");
579273b04772824a8c547e1a8d33900040a03264bKeisuke Kuroyanagi * you may not use this file except in compliance with the License.
679273b04772824a8c547e1a8d33900040a03264bKeisuke Kuroyanagi * You may obtain a copy of the License at
779273b04772824a8c547e1a8d33900040a03264bKeisuke Kuroyanagi *
879273b04772824a8c547e1a8d33900040a03264bKeisuke Kuroyanagi *      http://www.apache.org/licenses/LICENSE-2.0
979273b04772824a8c547e1a8d33900040a03264bKeisuke Kuroyanagi *
1079273b04772824a8c547e1a8d33900040a03264bKeisuke Kuroyanagi * Unless required by applicable law or agreed to in writing, software
1179273b04772824a8c547e1a8d33900040a03264bKeisuke Kuroyanagi * distributed under the License is distributed on an "AS IS" BASIS,
1279273b04772824a8c547e1a8d33900040a03264bKeisuke Kuroyanagi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1379273b04772824a8c547e1a8d33900040a03264bKeisuke Kuroyanagi * See the License for the specific language governing permissions and
1479273b04772824a8c547e1a8d33900040a03264bKeisuke Kuroyanagi * limitations under the License.
1579273b04772824a8c547e1a8d33900040a03264bKeisuke Kuroyanagi */
1679273b04772824a8c547e1a8d33900040a03264bKeisuke Kuroyanagi
1779273b04772824a8c547e1a8d33900040a03264bKeisuke Kuroyanagi#ifndef LATINIME_DICT_TOOLKIT_ARGUMENTS_AND_OPTIONS_H
1879273b04772824a8c547e1a8d33900040a03264bKeisuke Kuroyanagi#define LATINIME_DICT_TOOLKIT_ARGUMENTS_AND_OPTIONS_H
1979273b04772824a8c547e1a8d33900040a03264bKeisuke Kuroyanagi
2079273b04772824a8c547e1a8d33900040a03264bKeisuke Kuroyanagi#include <string>
2179273b04772824a8c547e1a8d33900040a03264bKeisuke Kuroyanagi#include <unordered_map>
2279273b04772824a8c547e1a8d33900040a03264bKeisuke Kuroyanagi#include <vector>
2379273b04772824a8c547e1a8d33900040a03264bKeisuke Kuroyanagi
2479273b04772824a8c547e1a8d33900040a03264bKeisuke Kuroyanagi#include "dict_toolkit_defines.h"
2579273b04772824a8c547e1a8d33900040a03264bKeisuke Kuroyanagi
2679273b04772824a8c547e1a8d33900040a03264bKeisuke Kuroyanaginamespace latinime {
2779273b04772824a8c547e1a8d33900040a03264bKeisuke Kuroyanaginamespace dicttoolkit {
2879273b04772824a8c547e1a8d33900040a03264bKeisuke Kuroyanagi
2979273b04772824a8c547e1a8d33900040a03264bKeisuke Kuroyanagiclass ArgumentsAndOptions {
3079273b04772824a8c547e1a8d33900040a03264bKeisuke Kuroyanagi public:
3179273b04772824a8c547e1a8d33900040a03264bKeisuke Kuroyanagi    ArgumentsAndOptions() : mIsValid(false), mOptions(), mArguments() {}
3279273b04772824a8c547e1a8d33900040a03264bKeisuke Kuroyanagi
3379273b04772824a8c547e1a8d33900040a03264bKeisuke Kuroyanagi    ArgumentsAndOptions(std::unordered_map<std::string, std::string> &&options,
3479273b04772824a8c547e1a8d33900040a03264bKeisuke Kuroyanagi            std::unordered_map<std::string, std::vector<std::string>> &&arguments)
3579273b04772824a8c547e1a8d33900040a03264bKeisuke Kuroyanagi            : mIsValid(true), mOptions(std::move(options)), mArguments(std::move(arguments)) {}
3679273b04772824a8c547e1a8d33900040a03264bKeisuke Kuroyanagi
3779273b04772824a8c547e1a8d33900040a03264bKeisuke Kuroyanagi    bool isValid() const {
3879273b04772824a8c547e1a8d33900040a03264bKeisuke Kuroyanagi        return mIsValid;
3979273b04772824a8c547e1a8d33900040a03264bKeisuke Kuroyanagi    }
4079273b04772824a8c547e1a8d33900040a03264bKeisuke Kuroyanagi
4179273b04772824a8c547e1a8d33900040a03264bKeisuke Kuroyanagi    bool hasOption(const std::string &optionName) const {
4279273b04772824a8c547e1a8d33900040a03264bKeisuke Kuroyanagi        return mOptions.find(optionName) != mOptions.end();
4379273b04772824a8c547e1a8d33900040a03264bKeisuke Kuroyanagi    }
4479273b04772824a8c547e1a8d33900040a03264bKeisuke Kuroyanagi
451f8d4f47e445bd4316f3e09228cff6de64105f13Keisuke Kuroyanagi    const std::string &getOptionValue(const std::string &optionName) const {
461f8d4f47e445bd4316f3e09228cff6de64105f13Keisuke Kuroyanagi        const auto &it = mOptions.find(optionName);
471f8d4f47e445bd4316f3e09228cff6de64105f13Keisuke Kuroyanagi        ASSERT(it != mOptions.end());
481f8d4f47e445bd4316f3e09228cff6de64105f13Keisuke Kuroyanagi        return it->second;
491f8d4f47e445bd4316f3e09228cff6de64105f13Keisuke Kuroyanagi    }
501f8d4f47e445bd4316f3e09228cff6de64105f13Keisuke Kuroyanagi
511f8d4f47e445bd4316f3e09228cff6de64105f13Keisuke Kuroyanagi    bool hasArgument(const std::string &name) const {
521f8d4f47e445bd4316f3e09228cff6de64105f13Keisuke Kuroyanagi        const auto &it = mArguments.find(name);
531f8d4f47e445bd4316f3e09228cff6de64105f13Keisuke Kuroyanagi        return it != mArguments.end() && !it->second.empty();
541f8d4f47e445bd4316f3e09228cff6de64105f13Keisuke Kuroyanagi    }
551f8d4f47e445bd4316f3e09228cff6de64105f13Keisuke Kuroyanagi
561f8d4f47e445bd4316f3e09228cff6de64105f13Keisuke Kuroyanagi    const std::string &getSingleArgument(const std::string &name) const {
571f8d4f47e445bd4316f3e09228cff6de64105f13Keisuke Kuroyanagi        const auto &it = mArguments.find(name);
581f8d4f47e445bd4316f3e09228cff6de64105f13Keisuke Kuroyanagi        ASSERT(it != mArguments.end() && !it->second.empty());
591f8d4f47e445bd4316f3e09228cff6de64105f13Keisuke Kuroyanagi        return it->second.front();
601f8d4f47e445bd4316f3e09228cff6de64105f13Keisuke Kuroyanagi    }
611f8d4f47e445bd4316f3e09228cff6de64105f13Keisuke Kuroyanagi
621f8d4f47e445bd4316f3e09228cff6de64105f13Keisuke Kuroyanagi    const std::vector<std::string> &getVariableLengthArguments(const std::string &name) const {
631f8d4f47e445bd4316f3e09228cff6de64105f13Keisuke Kuroyanagi        const auto &it = mArguments.find(name);
641f8d4f47e445bd4316f3e09228cff6de64105f13Keisuke Kuroyanagi        ASSERT(it != mArguments.end());
651f8d4f47e445bd4316f3e09228cff6de64105f13Keisuke Kuroyanagi        return it->second;
661f8d4f47e445bd4316f3e09228cff6de64105f13Keisuke Kuroyanagi    }
671f8d4f47e445bd4316f3e09228cff6de64105f13Keisuke Kuroyanagi
6879273b04772824a8c547e1a8d33900040a03264bKeisuke Kuroyanagi private:
6979273b04772824a8c547e1a8d33900040a03264bKeisuke Kuroyanagi    DISALLOW_ASSIGNMENT_OPERATOR(ArgumentsAndOptions);
7079273b04772824a8c547e1a8d33900040a03264bKeisuke Kuroyanagi
7179273b04772824a8c547e1a8d33900040a03264bKeisuke Kuroyanagi    const bool mIsValid;
7279273b04772824a8c547e1a8d33900040a03264bKeisuke Kuroyanagi    const std::unordered_map<std::string, std::string> mOptions;
7379273b04772824a8c547e1a8d33900040a03264bKeisuke Kuroyanagi    const std::unordered_map<std::string, std::vector<std::string>> mArguments;
7479273b04772824a8c547e1a8d33900040a03264bKeisuke Kuroyanagi};
7579273b04772824a8c547e1a8d33900040a03264bKeisuke Kuroyanagi} // namespace dicttoolkit
7679273b04772824a8c547e1a8d33900040a03264bKeisuke Kuroyanagi} // namespace latinime
7779273b04772824a8c547e1a8d33900040a03264bKeisuke Kuroyanagi#endif // LATINIME_DICT_TOOLKIT_ARGUMENTS_AND_OPTIONS_H
78