Skip to content

Commit

Permalink
Add add/remove/set flag helpers for MessageHeader (project-chip#3054)
Browse files Browse the repository at this point in the history
* Starting to add set/clear flag methods to the message header

* Use the new methods in the header

* Create a typesafe bitflags class and use it in MessageHeader. Mark other non-typesafe flags as deprecated

* Add sizeof check and rename Get to Has

* Add a "HasOnly" method to bitflags

* Fix usage of static assert - message is needed
  • Loading branch information
andy31415 authored Oct 8, 2020
1 parent 2b85b54 commit f94a92d
Show file tree
Hide file tree
Showing 23 changed files with 220 additions and 179 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -41,3 +41,6 @@ __pycache__

# Doxygen outputs
docs/html

# VSCode java extensions
.project
2 changes: 1 addition & 1 deletion src/ble/BLEEndPoint.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,9 @@
#if CONFIG_NETWORK_LAYER_BLE
#include <core/CHIPConfig.h>

#include <support/BitFlags.h>
#include <support/CHIPFaultInjection.h>
#include <support/CodeUtils.h>
#include <support/FlagUtils.hpp>
#include <support/logging/CHIPLogging.h>

#include <ble/BLEEndPoint.h>
Expand Down
2 changes: 1 addition & 1 deletion src/ble/BtpEngine.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
#include <ble/BleConfig.h>

#include <ble/BleError.h>
#include <support/FlagUtils.hpp>
#include <support/BitFlags.h>
#include <system/SystemPacketBuffer.h>

namespace chip {
Expand Down
2 changes: 1 addition & 1 deletion src/lib/message/CHIPFabricState.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,9 @@

#include <core/CHIPKeyIds.h>
#include <protocols/security/CHIPApplicationKeys.h>
#include <support/BitFlags.h>
#include <support/CHIPCounter.h>
#include <support/DLLUtil.h>
#include <support/FlagUtils.hpp>
#include <support/PersistedCounter.h>

namespace chip {
Expand Down
2 changes: 1 addition & 1 deletion src/lib/message/ExchangeContext.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,9 @@
#include <message/CHIPSecurityMgr.h>
#include <protocols/CHIPProtocols.h>
#include <protocols/common/CommonProtocol.h>
#include <support/BitFlags.h>
#include <support/CHIPFaultInjection.h>
#include <support/CodeUtils.h>
#include <support/FlagUtils.hpp>
#include <support/RandUtils.h>
#include <support/logging/CHIPLogging.h>
#include <system/SystemStats.h>
Expand Down
1 change: 1 addition & 0 deletions src/lib/support/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ source_set("chip_version_header") {

support_headers = [
"Base64.h",
"BitFlags.h",
"BufBound.h",
"CHIPCounter.h",
"CodeUtils.h",
Expand Down
145 changes: 145 additions & 0 deletions src/lib/support/BitFlags.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
/*
*
* Copyright (c) 2020 Project CHIP Authors
* Copyright (c) 2013-2017 Nest Labs, Inc.
*
* 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.
*/

/**
* @file
* This file defines functions for manipulating Boolean flags in
* a bitfield.
*
*/

#ifndef CHIP_CHIP_SUPPORT_FLAGUTILS_HPP
#define CHIP_CHIP_SUPPORT_FLAGUTILS_HPP

#include <stdint.h>

#include <utility>

namespace chip {

/**
* Stores bit flags in a type safe manner.
*
* @tparam StorageType is the underlying storage type (like uint16_t, uint32_t etc.)
* @tparam FlagsEnum is the typesafe flags setting
*/
template <typename StorageType, typename FlagsEnum>
class BitFlags
{
public:
static_assert(sizeof(StorageType) >= sizeof(FlagsEnum), "All flags should fit in the storage type");

BitFlags() {}
BitFlags(const BitFlags &) = default;
BitFlags & operator=(const BitFlags &) = default;

BitFlags & Set(FlagsEnum v)
{
mValue = static_cast<StorageType>(mValue | static_cast<StorageType>(v));
return *this;
}

BitFlags & Clear(FlagsEnum v)
{
mValue &= static_cast<StorageType>(~static_cast<StorageType>(v));
return *this;
}

BitFlags & Set(FlagsEnum v, bool isSet) { return isSet ? Set(v) : Clear(v); }

bool Has(FlagsEnum v) const { return (mValue & static_cast<StorageType>(v)) != 0; }

BitFlags & Set(const BitFlags & other)
{
mValue |= other.mValue;
return *this;
}

StorageType Raw() const { return mValue; }
BitFlags & SetRaw(StorageType value)
{
mValue = value;
return *this;
}

/** Check that no flags outside the arguments are set.*/
template <typename... Args>
bool HasOnly(Args &&... args) const
{
return IsZeroAfterClearing(mValue, std::forward<Args>(args)...);
}

private:
StorageType mValue = 0;

template <typename... Args>
static bool IsZeroAfterClearing(StorageType value, FlagsEnum flagToClear, Args &&... args)
{
value &= static_cast<StorageType>(~static_cast<StorageType>(flagToClear));
return IsZeroAfterClearing(value, std::forward<Args>(args)...);
}

static bool IsZeroAfterClearing(StorageType value) { return value == 0; }
};

/**
* @deprecated Use typesafe BitFlags class instead.
*/
template <typename FlagsT, typename FlagT>
inline bool GetFlag(const FlagsT & inFlags, const FlagT inFlag)
{
return (inFlags & static_cast<FlagsT>(inFlag)) != 0;
}

/**
* @deprecated Use typesafe BitFlags class instead.
*/
template <typename FlagsT, typename FlagT>
inline void ClearFlag(FlagsT & inFlags, const FlagT inFlag)
{
inFlags &= static_cast<FlagsT>(~static_cast<FlagsT>(inFlag));
}

/**
* @deprecated Use typesafe BitFlags class instead.
*/
template <typename FlagsT, typename FlagT>
inline void SetFlag(FlagsT & inFlags, const FlagT inFlag)
{
inFlags = static_cast<FlagsT>(inFlags | static_cast<FlagsT>(inFlag));
}

/**
* @deprecated Use typesafe BitFlags class instead.
*/
template <typename FlagsT, typename FlagT>
inline void SetFlag(FlagsT & inFlags, const FlagT inFlag, const bool inValue)
{
if (inValue)
{
SetFlag(inFlags, inFlag);
}
else
{
ClearFlag(inFlags, inFlag);
}
}

} // namespace chip

#endif // CHIP_CHIP_SUPPORT_FLAGUTILS_HPP
66 changes: 0 additions & 66 deletions src/lib/support/FlagUtils.hpp

This file was deleted.

1 change: 0 additions & 1 deletion src/platform/Darwin/ConnectivityManagerImpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@
#include <platform/internal/GenericConnectivityManagerImpl_NoThread.h>
#endif
#include <platform/internal/GenericConnectivityManagerImpl_NoWiFi.h>
#include <support/FlagUtils.hpp>

namespace chip {
namespace Inet {
Expand Down
1 change: 0 additions & 1 deletion src/platform/EFR32/ConnectivityManagerImpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@
#include <platform/internal/GenericConnectivityManagerImpl_NoThread.h>
#endif
#include <platform/internal/GenericConnectivityManagerImpl_NoWiFi.h>
#include <support/FlagUtils.hpp>

namespace Inet {
class IPAddress;
Expand Down
1 change: 0 additions & 1 deletion src/platform/ESP32/ConnectivityManagerImpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@
#include <platform/internal/GenericConnectivityManagerImpl_NoBLE.h>
#endif
#include <platform/internal/GenericConnectivityManagerImpl_NoThread.h>
#include <support/FlagUtils.hpp>

#include "esp_event.h"

Expand Down
1 change: 0 additions & 1 deletion src/platform/K32W/ConnectivityManagerImpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@
#include <platform/internal/GenericConnectivityManagerImpl_NoThread.h>
#endif
#include <platform/internal/GenericConnectivityManagerImpl_NoWiFi.h>
#include <support/FlagUtils.hpp>

namespace chip {
namespace DeviceLayer {
Expand Down
1 change: 0 additions & 1 deletion src/platform/Linux/ConnectivityManagerImpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@
#else
#include <platform/internal/GenericConnectivityManagerImpl_NoWiFi.h>
#endif
#include <support/FlagUtils.hpp>

#if CHIP_DEVICE_CONFIG_ENABLE_WPA
#include <platform/Linux/dbus/wpa/DBusWpa.h>
Expand Down
1 change: 0 additions & 1 deletion src/platform/nRF5/ConnectivityManagerImpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@
#include <platform/internal/GenericConnectivityManagerImpl_NoThread.h>
#endif
#include <platform/internal/GenericConnectivityManagerImpl_NoWiFi.h>
#include <support/FlagUtils.hpp>

namespace chip {
namespace Inet {
Expand Down
1 change: 0 additions & 1 deletion src/platform/nrfconnect/ConnectivityManagerImpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@
#include <platform/internal/GenericConnectivityManagerImpl_NoThread.h>
#endif
#include <platform/internal/GenericConnectivityManagerImpl_NoWiFi.h>
#include <support/FlagUtils.hpp>

#include <support/logging/CHIPLogging.h>

Expand Down
1 change: 0 additions & 1 deletion src/platform/qpg6100/ConnectivityManagerImpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@
#include <platform/internal/GenericConnectivityManagerImpl_NoThread.h>
#endif
#include <platform/internal/GenericConnectivityManagerImpl_NoWiFi.h>
#include <support/FlagUtils.hpp>

namespace chip {
namespace Inet {
Expand Down
2 changes: 1 addition & 1 deletion src/transport/RendezvousSession.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ CHIP_ERROR RendezvousSession::SendPairingMessage(System::PacketBuffer * msgBuf)
SuccessOrExit(err);

msgBuf->ConsumeHead(headerSize);
err = mTransport->SendMessage(header, Header::Flags::None(), Transport::PeerAddress::BLE(), msgBuf);
err = mTransport->SendMessage(header, Header::Flags(), Transport::PeerAddress::BLE(), msgBuf);
SuccessOrExit(err);

exit:
Expand Down
Loading

0 comments on commit f94a92d

Please sign in to comment.