16a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski/*
26a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski * Copyright (C) 2016 The Android Open Source Project
36a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski *
46a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski * Licensed under the Apache License, Version 2.0 (the "License");
56a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski * you may not use this file except in compliance with the License.
66a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski * You may obtain a copy of the License at
76a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski *
86a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski *      http://www.apache.org/licenses/LICENSE-2.0
96a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski *
106a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski * Unless required by applicable law or agreed to in writing, software
116a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski * distributed under the License is distributed on an "AS IS" BASIS,
126a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski * See the License for the specific language governing permissions and
146a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski * limitations under the License.
156a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski */
166a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski
176a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski#ifndef AAPT_FILTER_CONFIGFILTER_H
186a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski#define AAPT_FILTER_CONFIGFILTER_H
196a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski
206a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski#include "ConfigDescription.h"
216a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski
226a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski#include <set>
236a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski#include <utility>
246a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski
256a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinskinamespace aapt {
266a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski
276a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski/**
286a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski * Matches ConfigDescriptions based on some pattern.
296a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski */
306a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinskiclass IConfigFilter {
316a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinskipublic:
326a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski    virtual ~IConfigFilter() = default;
336a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski
346a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski    /**
356a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski     * Returns true if the filter matches the configuration, false otherwise.
366a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski     */
376a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski    virtual bool match(const ConfigDescription& config) const = 0;
386a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski};
396a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski
406a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski/**
416a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski * Implements config axis matching. An axis is one component of a configuration, like screen
426a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski * density or locale. If an axis is specified in the filter, and the axis is specified in
436a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski * the configuration to match, they must be compatible. Otherwise the configuration to match is
446a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski * accepted.
456a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski *
466a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski * Used when handling "-c" options.
476a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski */
486a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinskiclass AxisConfigFilter : public IConfigFilter {
496a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinskipublic:
506a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski    void addConfig(ConfigDescription config);
516a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski
526a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski    bool match(const ConfigDescription& config) const override;
536a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski
546a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinskiprivate:
556a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski    std::set<std::pair<ConfigDescription, uint32_t>> mConfigs;
566a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski    uint32_t mConfigMask = 0;
576a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski};
586a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski
596a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski} // namespace aapt
606a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski
616a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski#endif /* AAPT_FILTER_CONFIGFILTER_H */
62