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