Skip to content

Commit

Permalink
Add offset_of and owner_of (#5979)
Browse files Browse the repository at this point in the history
* Add OwnerOf

* Restyled by whitespace

* Restyled by clang-format

Co-authored-by: Restyled.io <commits@restyled.io>
  • Loading branch information
2 people authored and pull[bot] committed Apr 19, 2021
1 parent fc6977b commit 7039244
Show file tree
Hide file tree
Showing 3 changed files with 94 additions and 0 deletions.
32 changes: 32 additions & 0 deletions src/lib/support/OwnerOf.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
/*
*
* 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 <cstddef>
#include <cstdint>

namespace chip {

template <class ClassType, class MemberType>
constexpr ClassType * OwnerOf(MemberType * ptr, const MemberType ClassType::*member)
{
return reinterpret_cast<ClassType *>(reinterpret_cast<uintptr_t>(ptr) - offsetof(ClassType, member));
}

} // namespace chip
1 change: 1 addition & 0 deletions src/lib/support/tests/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ chip_test_suite("tests") {
"TestCHIPCounter.cpp",
"TestCHIPMem.cpp",
"TestErrorStr.cpp",
"TestOwnerOf.cpp",
"TestPool.cpp",
"TestPrivateHeap.cpp",
"TestSafeInt.cpp",
Expand Down
61 changes: 61 additions & 0 deletions src/lib/support/tests/TestOwnerOf.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
/*
*
* 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.
*/

#include <support/OwnerOf.h>
#include <support/UnitTestRegistration.h>

#include <nlunit-test.h>

using namespace chip;

class Member
{
};

class Base
{
public:
uint32_t Offset0;
uint32_t Offset4;
Member member;
};

static void TestMemberOwner(nlTestSuite * inSuite, void * inContext)
{
Base base;
Member * member = &base.member;
NL_TEST_ASSERT(inSuite, OwnerOf(member, &Base::member) == &base);
NL_TEST_ASSERT(inSuite, &OwnerOf(member, &Base::member)->member == member);
}

#define NL_TEST_DEF_FN(fn) NL_TEST_DEF("Test " #fn, fn)
/**
* Test Suite. It lists all the test functions.
*/
static const nlTest sTests[] = { NL_TEST_DEF_FN(TestMemberOwner), NL_TEST_SENTINEL() };

int TestOwnerOf(void)
{
nlTestSuite theSuite = { "CHIP OwnerOf tests", &sTests[0], nullptr, nullptr };

// Run test suit againt one context.
nlTestRunner(&theSuite, nullptr);
return nlTestRunnerStats(&theSuite);
}

CHIP_REGISTER_TEST_SUITE(TestOwnerOf)

0 comments on commit 7039244

Please sign in to comment.