Skip to content

Commit

Permalink
Merge pull request #75 from SimeonEhrig/refactorMemAccessStrategy
Browse files Browse the repository at this point in the history
Refactor Memory Access Iterators
  • Loading branch information
SimeonEhrig authored Feb 15, 2022
2 parents a0ccee9 + f3aaa68 commit 4baaeb4
Show file tree
Hide file tree
Showing 17 changed files with 641 additions and 667 deletions.
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,7 @@ if(${CMAKE_PROJECT_NAME} STREQUAL ${PROJECT_NAME})
#########################################

if(BUILD_TESTING)
include("${PROJECT_SOURCE_DIR}/cmake/testUtils.cmake")
include(CTest)
enable_testing()
add_subdirectory("test/")
Expand Down
60 changes: 60 additions & 0 deletions cmake/testUtils.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
# Copyright 2022 Simeon Ehrig
#
# This file is part of vikunja.
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

# Create an executable file for the test, link it to the required test targets and add it to ctest.
#
# vikunja_add_default_test(TARGET <name>
# SOURCE <list of source files>
# [INCLUDE <list of include paths>]
# )
#
# * TARGET: name of the executable, will be prefixed with `test_`
# * SOURCE: path of the source file(s)
# * INCLUDE: optional path(s) to include folder(s)
macro(vikunja_add_default_test)
set(_MACRO_PREFIX "vikTest")
set(_SINGLE_ARG TARGET)
set(_MULTI_ARG SOURCE INCLUDE)

cmake_parse_arguments(
"${_MACRO_PREFIX}"
"" # option
"${_SINGLE_ARG}"
"${_MULTI_ARG}"
"${ARGN}"
)

if(NOT DEFINED ${_MACRO_PREFIX}_TARGET)
message(FATAL_ERROR "vikunja_add_default_test: no target name defined")
endif()

if(NOT DEFINED ${_MACRO_PREFIX}_SOURCE)
message(FATAL_ERROR "vikunja_add_default_test: no source files defined")
endif()

set(_TARGET_NAME "test_${${_MACRO_PREFIX}_TARGET}")

alpaka_add_executable(
${_TARGET_NAME}
${${_MACRO_PREFIX}_SOURCE}
)

if(DEFINED ${_MACRO_PREFIX}_INCLUDE)
message(VERBOSE "vikunja_add_default_test: add ${${_MACRO_PREFIX}_INCLUDE} include paths to ${_TARGET_NAME}")
target_include_directories(${_TARGET_NAME} PRIVATE ${${_MACRO_PREFIX}_INCLUDE})
endif()

target_link_libraries(${_TARGET_NAME}
PRIVATE
vikunja::internalvikunja
vikunja::testSetup
)

add_test(NAME ${_TARGET_NAME} COMMAND ${_TARGET_NAME} ${_VIKUNJA_TEST_OPTIONS})

endmacro()
101 changes: 101 additions & 0 deletions include/vikunja/access/BaseStrategy.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
/* Copyright 2022 Hauke Mewes, Jonas Schenke, Simeon Ehrig
*
* This file is part of vikunja.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/

#pragma once

#include <alpaka/alpaka.hpp>

namespace vikunja::MemAccess
{
//! Base class to implement memory access strategy.
//!
//! \tparam TIdx Index type
template<typename TIdx>
class BaseStrategy
{
protected:
TIdx m_index;
TIdx const m_maximum;

public:
//-----------------------------------------------------------------------------
//! Constructor.
//!
//! \param index The index.
//! \param maximum value of the index (not inclusive).
ALPAKA_FN_HOST_ACC ALPAKA_FN_INLINE BaseStrategy(TIdx const index, TIdx const maximum)
: m_index(index)
, m_maximum(maximum)
{
}

ALPAKA_FN_HOST_ACC ALPAKA_FN_INLINE BaseStrategy(const BaseStrategy& other) = default;

ALPAKA_FN_HOST_ACC ALPAKA_FN_INLINE constexpr friend auto operator==(
BaseStrategy const& st,
const BaseStrategy& other) -> bool
{
return (st.m_index == other.m_index) && (st.m_maximum == other.m_maximum);
}

ALPAKA_FN_HOST_ACC ALPAKA_FN_INLINE constexpr friend auto operator!=(
BaseStrategy const& st,
const BaseStrategy& other) -> bool
{
return !operator==(st, other);
}

ALPAKA_FN_HOST_ACC ALPAKA_FN_INLINE constexpr friend auto operator<(
BaseStrategy const& st,
const BaseStrategy& other) -> bool
{
return st.m_index < other.m_index;
}

ALPAKA_FN_HOST_ACC ALPAKA_FN_INLINE constexpr friend auto operator>(
BaseStrategy const& st,
const BaseStrategy& other) -> bool
{
return st.m_index > other.m_index;
}

ALPAKA_FN_HOST_ACC ALPAKA_FN_INLINE constexpr friend auto operator<=(
BaseStrategy const& st,
const BaseStrategy& other) -> bool
{
return st.m_index <= other.m_index;
}

ALPAKA_FN_HOST_ACC ALPAKA_FN_INLINE constexpr friend auto operator>=(
BaseStrategy const& st,
const BaseStrategy& other) -> bool
{
return st.m_index >= other.m_index;
}

//-----------------------------------------------------------------------------
//! Get the current index.
//!
//! Returns a const reference to the current index.
ALPAKA_FN_HOST_ACC ALPAKA_FN_INLINE auto operator*() const -> TIdx const&
{
return m_index;
}

//-----------------------------------------------------------------------------
//! Set the current index
//!
//! Returns a reference to the current index.
ALPAKA_FN_HOST_ACC ALPAKA_FN_INLINE auto operator*() -> TIdx&
{
return m_index;
}
};

} // namespace vikunja::MemAccess
Loading

0 comments on commit 4baaeb4

Please sign in to comment.