/* * * Copyright (c) 2021 Project CHIP Authors * All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include namespace chip { namespace app { /** * A representation of a concrete cluster path. This identifies a specific * cluster instance. */ struct ConcreteClusterPath { ConcreteClusterPath(EndpointId aEndpointId, ClusterId aClusterId) : mEndpointId(aEndpointId), mClusterId(aClusterId) {} ConcreteClusterPath() {} ConcreteClusterPath(const ConcreteClusterPath & aOther) = default; ConcreteClusterPath & operator=(const ConcreteClusterPath & aOther) = default; bool IsValidConcreteClusterPath() const { return !(mEndpointId == kInvalidEndpointId || mClusterId == kInvalidClusterId); } bool HasValidIds() const { return IsValidEndpointId(mEndpointId) && IsValidClusterId(mClusterId); } bool operator==(const ConcreteClusterPath & aOther) const { return mEndpointId == aOther.mEndpointId && mClusterId == aOther.mClusterId; } bool operator!=(const ConcreteClusterPath & aOther) const { return !(*this == aOther); } EndpointId mEndpointId = 0; // Note: not all subclasses of ConcreteClusterPath need mExpanded, but due // to alignment requirements it's "free" in the sense of not needing more // memory to put it here. But we don't initialize it, because that // increases codesize for the non-consumers. bool mExpanded; // NOTE: in between larger members, NOT initialized (see above) ClusterId mClusterId = 0; }; } // namespace app } // namespace chip