15beee10b17e676380727da0b16b98ba7568669ecPeng Xu/*
25beee10b17e676380727da0b16b98ba7568669ecPeng Xu * Copyright (C) 2017 The Android Open Source Project
35beee10b17e676380727da0b16b98ba7568669ecPeng Xu *
45beee10b17e676380727da0b16b98ba7568669ecPeng Xu * Licensed under the Apache License, Version 2.0 (the "License");
55beee10b17e676380727da0b16b98ba7568669ecPeng Xu * you may not use this file except in compliance with the License.
65beee10b17e676380727da0b16b98ba7568669ecPeng Xu * You may obtain a copy of the License at
75beee10b17e676380727da0b16b98ba7568669ecPeng Xu *
85beee10b17e676380727da0b16b98ba7568669ecPeng Xu *      http://www.apache.org/licenses/LICENSE-2.0
95beee10b17e676380727da0b16b98ba7568669ecPeng Xu *
105beee10b17e676380727da0b16b98ba7568669ecPeng Xu * Unless required by applicable law or agreed to in writing, software
115beee10b17e676380727da0b16b98ba7568669ecPeng Xu * distributed under the License is distributed on an "AS IS" BASIS,
125beee10b17e676380727da0b16b98ba7568669ecPeng Xu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135beee10b17e676380727da0b16b98ba7568669ecPeng Xu * See the License for the specific language governing permissions and
145beee10b17e676380727da0b16b98ba7568669ecPeng Xu * limitations under the License.
155beee10b17e676380727da0b16b98ba7568669ecPeng Xu */
165beee10b17e676380727da0b16b98ba7568669ecPeng Xu#ifndef HIDUTIL_TRISTATE_H_
175beee10b17e676380727da0b16b98ba7568669ecPeng Xu#define HIDUTIL_TRISTATE_H_
185beee10b17e676380727da0b16b98ba7568669ecPeng Xu
195beee10b17e676380727da0b16b98ba7568669ecPeng Xu#include <cassert>
205beee10b17e676380727da0b16b98ba7568669ecPeng Xu#include <iostream>
215beee10b17e676380727da0b16b98ba7568669ecPeng Xu
225beee10b17e676380727da0b16b98ba7568669ecPeng Xunamespace HidUtil {
235beee10b17e676380727da0b16b98ba7568669ecPeng Xutemplate<typename T>
245beee10b17e676380727da0b16b98ba7568669ecPeng Xuclass TriState {
255beee10b17e676380727da0b16b98ba7568669ecPeng Xupublic:
265beee10b17e676380727da0b16b98ba7568669ecPeng Xu    // constructor
275beee10b17e676380727da0b16b98ba7568669ecPeng Xu    TriState() : mIsSet(false) { }
285beee10b17e676380727da0b16b98ba7568669ecPeng Xu    TriState(const TriState<T> &other) : mIsSet(other.mIsSet), mValue(other.mValue) { }
295beee10b17e676380727da0b16b98ba7568669ecPeng Xu    explicit TriState(const T &value) : mIsSet(true), mValue(value) { }
305beee10b17e676380727da0b16b98ba7568669ecPeng Xu
315beee10b17e676380727da0b16b98ba7568669ecPeng Xu    void clear() {
325beee10b17e676380727da0b16b98ba7568669ecPeng Xu        mValue = T();
335beee10b17e676380727da0b16b98ba7568669ecPeng Xu        mIsSet = false;
345beee10b17e676380727da0b16b98ba7568669ecPeng Xu    }
355beee10b17e676380727da0b16b98ba7568669ecPeng Xu    bool isSet() const {
365beee10b17e676380727da0b16b98ba7568669ecPeng Xu        return mIsSet;
375beee10b17e676380727da0b16b98ba7568669ecPeng Xu    }
385beee10b17e676380727da0b16b98ba7568669ecPeng Xu
395beee10b17e676380727da0b16b98ba7568669ecPeng Xu    const T get(const T &defaultValue) const {
405beee10b17e676380727da0b16b98ba7568669ecPeng Xu        return isSet() ? mValue : defaultValue;
415beee10b17e676380727da0b16b98ba7568669ecPeng Xu    }
425beee10b17e676380727da0b16b98ba7568669ecPeng Xu
435beee10b17e676380727da0b16b98ba7568669ecPeng Xu    // operator overloading
445beee10b17e676380727da0b16b98ba7568669ecPeng Xu    explicit operator T () const {
455beee10b17e676380727da0b16b98ba7568669ecPeng Xu        assert(mIsSet);
465beee10b17e676380727da0b16b98ba7568669ecPeng Xu        return mValue;
475beee10b17e676380727da0b16b98ba7568669ecPeng Xu    }
485beee10b17e676380727da0b16b98ba7568669ecPeng Xu
495beee10b17e676380727da0b16b98ba7568669ecPeng Xu    TriState<T>& operator=(const TriState<T> &other) {
505beee10b17e676380727da0b16b98ba7568669ecPeng Xu        mIsSet = other.mIsSet;
515beee10b17e676380727da0b16b98ba7568669ecPeng Xu        mValue = other.mValue;
525beee10b17e676380727da0b16b98ba7568669ecPeng Xu        return *this;
535beee10b17e676380727da0b16b98ba7568669ecPeng Xu    }
545beee10b17e676380727da0b16b98ba7568669ecPeng Xu
555beee10b17e676380727da0b16b98ba7568669ecPeng Xu    TriState<T>& operator=(const T& value) {
565beee10b17e676380727da0b16b98ba7568669ecPeng Xu        mIsSet = true;
575beee10b17e676380727da0b16b98ba7568669ecPeng Xu        mValue = value;
585beee10b17e676380727da0b16b98ba7568669ecPeng Xu        return *this;
595beee10b17e676380727da0b16b98ba7568669ecPeng Xu    }
605beee10b17e676380727da0b16b98ba7568669ecPeng Xu
615beee10b17e676380727da0b16b98ba7568669ecPeng Xu    TriState<T>& operator++()  {
625beee10b17e676380727da0b16b98ba7568669ecPeng Xu        if (mIsSet) {
635beee10b17e676380727da0b16b98ba7568669ecPeng Xu            mValue++;
645beee10b17e676380727da0b16b98ba7568669ecPeng Xu        }
655beee10b17e676380727da0b16b98ba7568669ecPeng Xu        return *this;
665beee10b17e676380727da0b16b98ba7568669ecPeng Xu    }
675beee10b17e676380727da0b16b98ba7568669ecPeng Xu
685beee10b17e676380727da0b16b98ba7568669ecPeng Xu    TriState<T> operator++(int) {
695beee10b17e676380727da0b16b98ba7568669ecPeng Xu        TriState<T> tmp(*this);
705beee10b17e676380727da0b16b98ba7568669ecPeng Xu        operator++();
715beee10b17e676380727da0b16b98ba7568669ecPeng Xu        return tmp;
725beee10b17e676380727da0b16b98ba7568669ecPeng Xu    }
735beee10b17e676380727da0b16b98ba7568669ecPeng Xu
745beee10b17e676380727da0b16b98ba7568669ecPeng Xu    TriState<T>& operator--()  {
755beee10b17e676380727da0b16b98ba7568669ecPeng Xu        if (mIsSet) {
765beee10b17e676380727da0b16b98ba7568669ecPeng Xu            mValue--;
775beee10b17e676380727da0b16b98ba7568669ecPeng Xu        }
785beee10b17e676380727da0b16b98ba7568669ecPeng Xu        return *this;
795beee10b17e676380727da0b16b98ba7568669ecPeng Xu    }
805beee10b17e676380727da0b16b98ba7568669ecPeng Xu
815beee10b17e676380727da0b16b98ba7568669ecPeng Xu    TriState<T> operator--(int) {
825beee10b17e676380727da0b16b98ba7568669ecPeng Xu        TriState<T> tmp(*this);
835beee10b17e676380727da0b16b98ba7568669ecPeng Xu        operator--();
845beee10b17e676380727da0b16b98ba7568669ecPeng Xu        return tmp;
855beee10b17e676380727da0b16b98ba7568669ecPeng Xu    }
865beee10b17e676380727da0b16b98ba7568669ecPeng Xu
875beee10b17e676380727da0b16b98ba7568669ecPeng Xu#define UNARY_OP(op) \
885beee10b17e676380727da0b16b98ba7568669ecPeng Xu    TriState<T> operator op() { \
895beee10b17e676380727da0b16b98ba7568669ecPeng Xu        TriState<T> tmp(*this); \
905beee10b17e676380727da0b16b98ba7568669ecPeng Xu        if (mIsSet) { \
915beee10b17e676380727da0b16b98ba7568669ecPeng Xu            tmp.mValue = op tmp.mValue; \
925beee10b17e676380727da0b16b98ba7568669ecPeng Xu        } \
935beee10b17e676380727da0b16b98ba7568669ecPeng Xu        return tmp; \
945beee10b17e676380727da0b16b98ba7568669ecPeng Xu    }
955beee10b17e676380727da0b16b98ba7568669ecPeng Xu
965beee10b17e676380727da0b16b98ba7568669ecPeng Xu    UNARY_OP(!);
975beee10b17e676380727da0b16b98ba7568669ecPeng Xu    UNARY_OP(-);
985beee10b17e676380727da0b16b98ba7568669ecPeng Xu    UNARY_OP(~);
995beee10b17e676380727da0b16b98ba7568669ecPeng Xu#undef UNARY_OP
1005beee10b17e676380727da0b16b98ba7568669ecPeng Xu
1015beee10b17e676380727da0b16b98ba7568669ecPeng Xu#define COMPOUND_ASSIGN_OP(op) \
1025beee10b17e676380727da0b16b98ba7568669ecPeng Xu    TriState<T>& operator op (const TriState<T>& rhs) { \
1035beee10b17e676380727da0b16b98ba7568669ecPeng Xu        if (mIsSet && rhs.mIsSet) { \
1045beee10b17e676380727da0b16b98ba7568669ecPeng Xu            mValue op rhs.mValue; \
1055beee10b17e676380727da0b16b98ba7568669ecPeng Xu        } else { \
1065beee10b17e676380727da0b16b98ba7568669ecPeng Xu            mIsSet = false; \
1075beee10b17e676380727da0b16b98ba7568669ecPeng Xu        } \
1085beee10b17e676380727da0b16b98ba7568669ecPeng Xu        return *this; \
1095beee10b17e676380727da0b16b98ba7568669ecPeng Xu    } \
1105beee10b17e676380727da0b16b98ba7568669ecPeng Xu    TriState<T>& operator op(const T& rhs) { \
1115beee10b17e676380727da0b16b98ba7568669ecPeng Xu        if (mIsSet) { \
1125beee10b17e676380727da0b16b98ba7568669ecPeng Xu            mValue op rhs; \
1135beee10b17e676380727da0b16b98ba7568669ecPeng Xu        } \
1145beee10b17e676380727da0b16b98ba7568669ecPeng Xu        return *this; \
1155beee10b17e676380727da0b16b98ba7568669ecPeng Xu    }
1165beee10b17e676380727da0b16b98ba7568669ecPeng Xu
1175beee10b17e676380727da0b16b98ba7568669ecPeng Xu    COMPOUND_ASSIGN_OP(+=);
1185beee10b17e676380727da0b16b98ba7568669ecPeng Xu    COMPOUND_ASSIGN_OP(-=);
1195beee10b17e676380727da0b16b98ba7568669ecPeng Xu    COMPOUND_ASSIGN_OP(*=);
1205beee10b17e676380727da0b16b98ba7568669ecPeng Xu    COMPOUND_ASSIGN_OP(/=);
1215beee10b17e676380727da0b16b98ba7568669ecPeng Xu    COMPOUND_ASSIGN_OP(%=);
1225beee10b17e676380727da0b16b98ba7568669ecPeng Xu    COMPOUND_ASSIGN_OP(&=);
1235beee10b17e676380727da0b16b98ba7568669ecPeng Xu    COMPOUND_ASSIGN_OP(|=);
1245beee10b17e676380727da0b16b98ba7568669ecPeng Xu    COMPOUND_ASSIGN_OP(^=);
1255beee10b17e676380727da0b16b98ba7568669ecPeng Xu#undef COMPOUND_ASSIGN_OP
1265beee10b17e676380727da0b16b98ba7568669ecPeng Xu
1275beee10b17e676380727da0b16b98ba7568669ecPeng Xu    TriState<T>& operator >>=(int i) {
1285beee10b17e676380727da0b16b98ba7568669ecPeng Xu        if (mIsSet) {
1295beee10b17e676380727da0b16b98ba7568669ecPeng Xu            mValue >>= i;
1305beee10b17e676380727da0b16b98ba7568669ecPeng Xu        }
1315beee10b17e676380727da0b16b98ba7568669ecPeng Xu        return *this; \
1325beee10b17e676380727da0b16b98ba7568669ecPeng Xu    }
1335beee10b17e676380727da0b16b98ba7568669ecPeng Xu
1345beee10b17e676380727da0b16b98ba7568669ecPeng Xu    TriState<T>& operator <<=(int i) {
1355beee10b17e676380727da0b16b98ba7568669ecPeng Xu        if (mIsSet) {
1365beee10b17e676380727da0b16b98ba7568669ecPeng Xu            mValue <<= i;
1375beee10b17e676380727da0b16b98ba7568669ecPeng Xu        }
1385beee10b17e676380727da0b16b98ba7568669ecPeng Xu        return *this; \
1395beee10b17e676380727da0b16b98ba7568669ecPeng Xu    }
1405beee10b17e676380727da0b16b98ba7568669ecPeng Xu
1415beee10b17e676380727da0b16b98ba7568669ecPeng Xu    TriState<T> operator <<(int i) { \
1425beee10b17e676380727da0b16b98ba7568669ecPeng Xu        TriState<T> tmp(*this);
1435beee10b17e676380727da0b16b98ba7568669ecPeng Xu        operator<<(i);
1445beee10b17e676380727da0b16b98ba7568669ecPeng Xu        return tmp;
1455beee10b17e676380727da0b16b98ba7568669ecPeng Xu    }
1465beee10b17e676380727da0b16b98ba7568669ecPeng Xu
1475beee10b17e676380727da0b16b98ba7568669ecPeng Xu    TriState<T> operator >>(int i) { \
1485beee10b17e676380727da0b16b98ba7568669ecPeng Xu        TriState<T> tmp(*this);
1495beee10b17e676380727da0b16b98ba7568669ecPeng Xu        operator>>(i);
1505beee10b17e676380727da0b16b98ba7568669ecPeng Xu        return tmp;
1515beee10b17e676380727da0b16b98ba7568669ecPeng Xu    }
1525beee10b17e676380727da0b16b98ba7568669ecPeng Xu
1535beee10b17e676380727da0b16b98ba7568669ecPeng Xu#define BINARY_OP(op, compound_op) \
1545beee10b17e676380727da0b16b98ba7568669ecPeng Xu    friend TriState<T> operator op(TriState<T> lhs, const TriState<T>& rhs) { \
1555beee10b17e676380727da0b16b98ba7568669ecPeng Xu        lhs compound_op rhs; \
1565beee10b17e676380727da0b16b98ba7568669ecPeng Xu    return lhs; \
1575beee10b17e676380727da0b16b98ba7568669ecPeng Xu    }\
1585beee10b17e676380727da0b16b98ba7568669ecPeng Xu        friend TriState<T> operator op(TriState<T> lhs, const T& rhs) { \
1595beee10b17e676380727da0b16b98ba7568669ecPeng Xu    lhs compound_op rhs; \
1605beee10b17e676380727da0b16b98ba7568669ecPeng Xu        return lhs; \
1615beee10b17e676380727da0b16b98ba7568669ecPeng Xu    }\
1625beee10b17e676380727da0b16b98ba7568669ecPeng Xu    friend TriState<T> operator op(const T &lhs, const TriState<T>& rhs) { \
1635beee10b17e676380727da0b16b98ba7568669ecPeng Xu        TriState<T> tmp(lhs); \
1645beee10b17e676380727da0b16b98ba7568669ecPeng Xu        return tmp op rhs; \
1655beee10b17e676380727da0b16b98ba7568669ecPeng Xu    }
1665beee10b17e676380727da0b16b98ba7568669ecPeng Xu
1675beee10b17e676380727da0b16b98ba7568669ecPeng Xu    BINARY_OP(+, +=);
1685beee10b17e676380727da0b16b98ba7568669ecPeng Xu    BINARY_OP(-, -=);
1695beee10b17e676380727da0b16b98ba7568669ecPeng Xu    BINARY_OP(*, *=);
1705beee10b17e676380727da0b16b98ba7568669ecPeng Xu    BINARY_OP(/, /=);
1715beee10b17e676380727da0b16b98ba7568669ecPeng Xu    BINARY_OP(%, %=);
1725beee10b17e676380727da0b16b98ba7568669ecPeng Xu    BINARY_OP(&, &=);
1735beee10b17e676380727da0b16b98ba7568669ecPeng Xu    BINARY_OP(|, |=);
1745beee10b17e676380727da0b16b98ba7568669ecPeng Xu    BINARY_OP(^, ^=);
1755beee10b17e676380727da0b16b98ba7568669ecPeng Xu#undef BINARY_OP
1765beee10b17e676380727da0b16b98ba7568669ecPeng Xu
1775beee10b17e676380727da0b16b98ba7568669ecPeng Xu#define RELATION_OP(op) \
1785beee10b17e676380727da0b16b98ba7568669ecPeng Xu    friend TriState<bool> operator op(const TriState<T>& lhs, const TriState<T>& rhs) { \
1795beee10b17e676380727da0b16b98ba7568669ecPeng Xu        if (lhs.mIsSet && rhs.mIsSet) { \
1805beee10b17e676380727da0b16b98ba7568669ecPeng Xu            return TriState<bool>(lhs.mValue op rhs.mValue); \
1815beee10b17e676380727da0b16b98ba7568669ecPeng Xu        } else { \
1825beee10b17e676380727da0b16b98ba7568669ecPeng Xu        return TriState<bool>(); \
1835beee10b17e676380727da0b16b98ba7568669ecPeng Xu        } \
1845beee10b17e676380727da0b16b98ba7568669ecPeng Xu    } \
1855beee10b17e676380727da0b16b98ba7568669ecPeng Xu    friend TriState<bool> operator op(const TriState<T>& lhs, const T& rhs) { \
1865beee10b17e676380727da0b16b98ba7568669ecPeng Xu        if (lhs.mIsSet) { \
1875beee10b17e676380727da0b16b98ba7568669ecPeng Xu            return TriState<bool>(lhs.mValue op rhs); \
1885beee10b17e676380727da0b16b98ba7568669ecPeng Xu        } else { \
1895beee10b17e676380727da0b16b98ba7568669ecPeng Xu            return TriState<bool>(); \
1905beee10b17e676380727da0b16b98ba7568669ecPeng Xu        } \
1915beee10b17e676380727da0b16b98ba7568669ecPeng Xu    } \
1925beee10b17e676380727da0b16b98ba7568669ecPeng Xu    friend TriState<bool> operator op(const T& lhs, const TriState<T>& rhs) { \
1935beee10b17e676380727da0b16b98ba7568669ecPeng Xu        if (rhs.mIsSet) { \
1945beee10b17e676380727da0b16b98ba7568669ecPeng Xu            return TriState<bool>(lhs op rhs.mValue); \
1955beee10b17e676380727da0b16b98ba7568669ecPeng Xu        } else { \
1965beee10b17e676380727da0b16b98ba7568669ecPeng Xu            return TriState<bool>(); \
1975beee10b17e676380727da0b16b98ba7568669ecPeng Xu        } \
1985beee10b17e676380727da0b16b98ba7568669ecPeng Xu    }
1995beee10b17e676380727da0b16b98ba7568669ecPeng Xu
2005beee10b17e676380727da0b16b98ba7568669ecPeng Xu    RELATION_OP(==);
2015beee10b17e676380727da0b16b98ba7568669ecPeng Xu    RELATION_OP(!=);
2025beee10b17e676380727da0b16b98ba7568669ecPeng Xu    RELATION_OP(>=);
2035beee10b17e676380727da0b16b98ba7568669ecPeng Xu    RELATION_OP(<=);
2045beee10b17e676380727da0b16b98ba7568669ecPeng Xu    RELATION_OP(>);
2055beee10b17e676380727da0b16b98ba7568669ecPeng Xu    RELATION_OP(<);
2065beee10b17e676380727da0b16b98ba7568669ecPeng Xu#undef RELATION_OP
2075beee10b17e676380727da0b16b98ba7568669ecPeng Xu
2085beee10b17e676380727da0b16b98ba7568669ecPeng Xu    friend TriState<bool> operator &&(TriState<T>& lhs, const TriState<T>& rhs) {
2095beee10b17e676380727da0b16b98ba7568669ecPeng Xu        if (lhs.mIsSet && rhs.mIsSet) {
2105beee10b17e676380727da0b16b98ba7568669ecPeng Xu            return TriState<bool>(lhs.mValue && rhs.mValue);
2115beee10b17e676380727da0b16b98ba7568669ecPeng Xu        } else {
2125beee10b17e676380727da0b16b98ba7568669ecPeng Xu            return TriState<bool>();
2135beee10b17e676380727da0b16b98ba7568669ecPeng Xu        }
2145beee10b17e676380727da0b16b98ba7568669ecPeng Xu    }
2155beee10b17e676380727da0b16b98ba7568669ecPeng Xu
2165beee10b17e676380727da0b16b98ba7568669ecPeng Xu    friend TriState<bool> operator ||(TriState<T>& lhs, const TriState<T>& rhs) {
2175beee10b17e676380727da0b16b98ba7568669ecPeng Xu        if (lhs.mIsSet && rhs.mIsSet) {
2185beee10b17e676380727da0b16b98ba7568669ecPeng Xu            return TriState<bool>(lhs.mValue || rhs.mValue);
2195beee10b17e676380727da0b16b98ba7568669ecPeng Xu        } else {
2205beee10b17e676380727da0b16b98ba7568669ecPeng Xu            return TriState<bool>();
2215beee10b17e676380727da0b16b98ba7568669ecPeng Xu        }
2225beee10b17e676380727da0b16b98ba7568669ecPeng Xu    }
2235beee10b17e676380727da0b16b98ba7568669ecPeng Xu
2245beee10b17e676380727da0b16b98ba7568669ecPeng Xu    friend std::ostream& operator <<(std::ostream &os, const TriState<T> &v) {
2255beee10b17e676380727da0b16b98ba7568669ecPeng Xu        if (v.mIsSet) {
2265beee10b17e676380727da0b16b98ba7568669ecPeng Xu            os << v.mValue;
2275beee10b17e676380727da0b16b98ba7568669ecPeng Xu        } else {
2285beee10b17e676380727da0b16b98ba7568669ecPeng Xu            os << "[not set]";
2295beee10b17e676380727da0b16b98ba7568669ecPeng Xu        }
2305beee10b17e676380727da0b16b98ba7568669ecPeng Xu        return os;
2315beee10b17e676380727da0b16b98ba7568669ecPeng Xu    }
2325beee10b17e676380727da0b16b98ba7568669ecPeng Xu
2335beee10b17e676380727da0b16b98ba7568669ecPeng Xu    friend std::istream& operator >>(std::istream &is, const TriState<T> &v) {
2345beee10b17e676380727da0b16b98ba7568669ecPeng Xu        T a;
2355beee10b17e676380727da0b16b98ba7568669ecPeng Xu        is >> a;
2365beee10b17e676380727da0b16b98ba7568669ecPeng Xu        v = TriState<T>(a);
2375beee10b17e676380727da0b16b98ba7568669ecPeng Xu        return is;
2385beee10b17e676380727da0b16b98ba7568669ecPeng Xu    }
2395beee10b17e676380727da0b16b98ba7568669ecPeng Xuprivate:
2405beee10b17e676380727da0b16b98ba7568669ecPeng Xu    bool mIsSet;
2415beee10b17e676380727da0b16b98ba7568669ecPeng Xu    T mValue;
2425beee10b17e676380727da0b16b98ba7568669ecPeng Xu};
2435beee10b17e676380727da0b16b98ba7568669ecPeng Xu
2445beee10b17e676380727da0b16b98ba7568669ecPeng Xu// commonly used ones
2455beee10b17e676380727da0b16b98ba7568669ecPeng Xutypedef TriState<unsigned> tri_uint;
2465beee10b17e676380727da0b16b98ba7568669ecPeng Xutypedef TriState<int> tri_int;
2475beee10b17e676380727da0b16b98ba7568669ecPeng Xu
2485beee10b17e676380727da0b16b98ba7568669ecPeng Xutypedef TriState<uint32_t> tri_uint32_t;
2495beee10b17e676380727da0b16b98ba7568669ecPeng Xutypedef TriState<int32_t> tri_int32_t;
2505beee10b17e676380727da0b16b98ba7568669ecPeng Xutypedef TriState<uint8_t> tri_uint8_t;
2515beee10b17e676380727da0b16b98ba7568669ecPeng Xutypedef TriState<uint16_t> tri_uint16_t;
2525beee10b17e676380727da0b16b98ba7568669ecPeng Xu}
2535beee10b17e676380727da0b16b98ba7568669ecPeng Xu
2545beee10b17e676380727da0b16b98ba7568669ecPeng Xu#endif // HIDUTIL_TRISTATE_H_
255