diff --git a/src/access/ProviderDeviceTypeResolver.h b/src/access/ProviderDeviceTypeResolver.h index 6740818d0138fd..200ffe17f6b35b 100644 --- a/src/access/ProviderDeviceTypeResolver.h +++ b/src/access/ProviderDeviceTypeResolver.h @@ -32,10 +32,6 @@ class DynamicProviderDeviceTypeResolver : public chip::Access::AccessControl::De bool IsDeviceTypeOnEndpoint(chip::DeviceTypeId deviceType, chip::EndpointId endpoint) override { auto it = mModelGetter()->GetDeviceTypes(endpoint); - if (!it) - { - return false; - } for (auto type = it->Next(); type.has_value(); type = it->Next()) { if (type->deviceTypeId == deviceType) diff --git a/src/app/clusters/descriptor/descriptor.cpp b/src/app/clusters/descriptor/descriptor.cpp index a04eb15e5653f9..e887ff1b7eeea7 100644 --- a/src/app/clusters/descriptor/descriptor.cpp +++ b/src/app/clusters/descriptor/descriptor.cpp @@ -156,11 +156,6 @@ CHIP_ERROR DescriptorAttrAccess::ReadDeviceAttribute(EndpointId endpoint, Attrib { CHIP_ERROR err = aEncoder.EncodeList([&endpoint](const auto & encoder) -> CHIP_ERROR { auto it = InteractionModelEngine::GetInstance()->GetDataModelProvider()->GetDeviceTypes(endpoint); - if (!it) - { - return CHIP_NO_ERROR; - } - for (auto deviceType = it->Next(); deviceType.has_value(); deviceType = it->Next()) { Descriptor::Structs::DeviceTypeStruct::Type deviceStruct; diff --git a/src/app/clusters/descriptor/descriptor.h b/src/app/clusters/descriptor/descriptor.h index 8dd4ea745fcf66..c116a40604068e 100644 --- a/src/app/clusters/descriptor/descriptor.h +++ b/src/app/clusters/descriptor/descriptor.h @@ -14,6 +14,8 @@ * limitations under the License. */ +#include + namespace chip { namespace app { namespace Clusters { diff --git a/src/app/data-model-provider/Iterators.h b/src/app/data-model-provider/Iterators.h index 48e30fe9725a19..3d2db41e1b3847 100644 --- a/src/app/data-model-provider/Iterators.h +++ b/src/app/data-model-provider/Iterators.h @@ -74,18 +74,19 @@ class MetaDataIterator : public FastForwardIterator }; template -class NullFastForwardIterator : public FastForwardIterator +class NullElementIterator : public ElementIterator { public: std::optional Next() override { return std::nullopt; } - bool SeekTo(const T & value) override { return false; } }; /// Null iterator, generally just used for tests template -class NullMetadataIterator : public NullFastForwardIterator +class NullMetadataIterator : public MetaDataIterator { public: + std::optional Next() override { return std::nullopt; } + bool SeekTo(const T & value) override { return false; } std::optional GetMetadata() override { return std::nullopt; } }; diff --git a/src/app/data-model-provider/MetadataTypes.h b/src/app/data-model-provider/MetadataTypes.h index 152d234e8dff45..939fa94c9a2738 100644 --- a/src/app/data-model-provider/MetadataTypes.h +++ b/src/app/data-model-provider/MetadataTypes.h @@ -17,6 +17,7 @@ #pragma once #include +#include #include #include @@ -192,27 +193,51 @@ class ProviderMetadataTree // tight loop/operation within event loop processing and SHOULD NOT be // stored for use across execution boundaries // + // RETURN VALUES + // + // - These MUST NOT return null pointer. Use NullIterators if empty data sets + // are to be returned. + // // PERFORMANCE // // - Lookups should be performed using `Get...` and `SeekTo`. // ///////////////////////////////////////////////////////////////////////// - virtual std::unique_ptr> GetEndpoints() { return nullptr; } - virtual std::unique_ptr> GetDeviceTypes(EndpointId endpointId) { return nullptr; } - virtual std::unique_ptr> GetSemanticTags(EndpointId endpointId) { return nullptr; } + virtual std::unique_ptr> GetEndpoints() + { + return std::make_unique>(); + } + virtual std::unique_ptr> GetDeviceTypes(EndpointId endpointId) + { + return std::make_unique>(); + } + virtual std::unique_ptr> GetSemanticTags(EndpointId endpointId) + { + return std::make_unique>(); + } - virtual std::unique_ptr> GetServerClusters(EndpointId endpointId) { return nullptr; } - virtual std::unique_ptr> GetClientClusters(EndpointId endpointId) { return nullptr; } + virtual std::unique_ptr> GetServerClusters(EndpointId endpointId) + { + return std::make_unique>(); + } + + virtual std::unique_ptr> GetClientClusters(EndpointId endpointId) + { + return std::make_unique>(); + } virtual std::unique_ptr> GetAttributes(ConcreteClusterPath clusterPath) { - return nullptr; + return std::make_unique>(); } virtual std::unique_ptr> GetAcceptedCommands(ConcreteClusterPath clusterPath) { - return nullptr; + return std::make_unique>(); + } + virtual std::unique_ptr> GetGeneratedCommands(ConcreteClusterPath clusterPath) + { + return std::make_unique>(); } - virtual std::unique_ptr> GetGeneratedCommands(ConcreteClusterPath clusterPath) { return nullptr; } // This iteration will list all the endpoints in the data model virtual EndpointEntry FirstEndpoint() = 0; diff --git a/src/data-model-providers/codegen/CodegenDataModelProvider.cpp b/src/data-model-providers/codegen/CodegenDataModelProvider.cpp index 646750b68924de..369803959649b6 100644 --- a/src/data-model-providers/codegen/CodegenDataModelProvider.cpp +++ b/src/data-model-providers/codegen/CodegenDataModelProvider.cpp @@ -887,7 +887,7 @@ CodegenDataModelProvider::GetDeviceTypes(EndpointId endpointId) std::optional endpoint_index = TryFindEndpointIndex(endpointId); if (!endpoint_index.has_value()) { - return nullptr; + return std::make_unique>(); } CHIP_ERROR err = CHIP_NO_ERROR;