1/*
2 * Copyright (C) 2018 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef ANDROID_VINTF_MATRIX_INSTANCE_H
18#define ANDROID_VINTF_MATRIX_INSTANCE_H
19
20#include <string>
21
22#include <hidl-util/FqInstance.h>
23
24#include "VersionRange.h"
25
26namespace android {
27namespace vintf {
28
29class MatrixInstance {
30   public:
31    MatrixInstance();
32    MatrixInstance(const MatrixInstance&);
33    MatrixInstance(MatrixInstance&&);
34    MatrixInstance& operator=(const MatrixInstance&);
35    MatrixInstance& operator=(MatrixInstance&&);
36
37    using VersionType = VersionRange;
38    // fqInstance.version is ignored. Version range is provided separately.
39    MatrixInstance(FqInstance&& fqInstance, VersionRange&& range, bool optional, bool isRegex);
40    MatrixInstance(const FqInstance fqInstance, const VersionRange& range, bool optional,
41                   bool isRegex);
42    const std::string& package() const;
43    const VersionRange& versionRange() const;
44    const std::string& interface() const;
45    bool optional() const;
46
47    bool isSatisfiedBy(const FqInstance& provided) const;
48
49    // If isRegex, return true if instance matches the pattern.
50    // If !isRegex, return true if e == instance().
51    // Follows rules of "Extended Regular Expression" (ERE).
52    bool matchInstance(const std::string& e) const;
53
54    // If isRegex, return the regex pattern. Else empty string.
55    const std::string& regexPattern() const;
56
57    // If !isRegex, return the exact instance name. Else empty string.
58    const std::string& exactInstance() const;
59
60    bool isRegex() const;
61
62   private:
63    FqInstance mFqInstance;
64    VersionRange mRange;
65    bool mOptional = false;
66    bool mIsRegex = false;
67};
68
69}  // namespace vintf
70}  // namespace android
71
72#endif  // ANDROID_VINTF_MATRIX_INSTANCE_H
73