Commit 338597fe authored by Alberto Miranda's avatar Alberto Miranda ♨️
Browse files

Add utils::static_unique_ptr_cast()

Also, replace all static_cast<T*>(base.get()) constructs by
utils::static_unique_ptr_cast<T>(std::move(base)).
For example:
    auto request =
        static_cast<api::iotask_create_request*>(base_request.get());
becomes:
    auto request =
        utils::static_unique_ptr_cast<api::iotask_create_request>(
            std::move(base_request));
parent 368ce5dd
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -86,6 +86,7 @@ liburd_aux_la_SOURCES = \
	thread-pool.hpp \
	thread-pool/thread-pool.hpp \
	thread-pool/thread-pool-queue.hpp \
	unique-ptr-cast.hpp \
	urd.cpp	\
	urd.hpp	\
	utils.cpp \
+64 −0
Original line number Diff line number Diff line
/*************************************************************************
 * Copyright (C) 2017-2018 Barcelona Supercomputing Center               *
 *                         Centro Nacional de Supercomputacion           *
 *                                                                       *
 * This file is part of the Data Scheduler, a daemon for tracking and    *
 * managing requests for asynchronous data transfer in a hierarchical    *
 * storage environment.                                                  *
 *                                                                       *
 * See AUTHORS file in the top level directory for information           *
 * regarding developers and contributors.                                *
 *                                                                       *
 * The Data Scheduler is free software: you can redistribute it and/or   *
 * modify it under the terms of the GNU Lesser General Public License    *
 * as published by the Free Software Foundation, either version 3 of     *
 * the License, or (at your option) any later version.                   *
 *                                                                       *
 * The Data Scheduler is distributed in the hope that it will be useful, *
 * but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU     *
 * Lesser General Public License for more details.                       *
 *                                                                       *
 * You should have received a copy of the GNU Lesser General             *
 * Public License along with Data Scheduler.  If not, see                *
 * <http://www.gnu.org/licenses/>.                                       *
 *                                                                       *
 *************************************************************************/

#include <memory>

#ifndef __UNIQUE_PTR_CAST_HPP__
#define __UNIQUE_PTR_CAST_HPP__

namespace utils {

template<typename Derived, typename Base, typename Del>
std::unique_ptr<Derived, Del> 
static_unique_ptr_cast( std::unique_ptr<Base, Del>&& p )
{
    auto d = static_cast<Derived *>(p.release());
    return std::unique_ptr<Derived, Del>(d, std::move(p.get_deleter()));
}

template<typename Derived, typename Base, typename Del>
std::unique_ptr<Derived, Del> 
static_unique_ptr_cast(const std::unique_ptr<Base, Del>&& p )
{
    return static_unique_ptr_cast<Derived, Base, Del>(
            std::move(const_cast<std::unique_ptr<Base, Del>&>(p)));
}

template<typename Derived, typename Base, typename Del>
std::unique_ptr<Derived, Del> 
dynamic_unique_ptr_cast( std::unique_ptr<Base, Del>&& p )
{
    if(Derived *result = dynamic_cast<Derived *>(p.get())) {
        p.release();
        return std::unique_ptr<Derived, Del>(result, std::move(p.get_deleter()));
    }
    return std::unique_ptr<Derived, Del>(nullptr, p.get_deleter());
}

} // namespace utils

#endif /* __UNIQUE_PTR_CAST_HPP__ */
+10 −10
Original line number Diff line number Diff line
@@ -202,7 +202,7 @@ response_ptr urd::create_task(const request_ptr base_request) {


    // downcast the generic request to the concrete implementation
    auto request = static_cast<api::iotask_create_request*>(base_request.get());
    auto request = utils::static_unique_ptr_cast<api::iotask_create_request>(std::move(base_request));

    auto type = request->get<0>();
    auto src_info = request->get<1>();
@@ -305,7 +305,7 @@ response_ptr urd::check_on_task(const request_ptr base_request) const {
    norns_error_t rv = NORNS_SUCCESS;

    // downcast the generic request to the concrete implementation
    auto request = static_cast<api::iotask_status_request*>(base_request.get());
    auto request = utils::static_unique_ptr_cast<api::iotask_status_request>(std::move(base_request));

    std::shared_ptr<io::task_stats> stats_ptr;

@@ -351,7 +351,7 @@ response_ptr urd::register_job(const request_ptr base_request) {
    response_ptr resp = std::make_unique<api::job_register_response>();

    // downcast the generic request to the concrete implementation
    auto request = static_cast<api::job_register_request*>(base_request.get());
    auto request = utils::static_unique_ptr_cast<api::job_register_request>(std::move(base_request));

    uint32_t jobid = request->get<0>();
    auto hosts = request->get<1>();
@@ -377,7 +377,7 @@ response_ptr urd::update_job(const request_ptr base_request) {
    response_ptr resp = std::make_unique<api::job_update_response>();

    // downcast the generic request to the concrete implementation
    auto request = static_cast<api::job_update_request*>(base_request.get());
    auto request = utils::static_unique_ptr_cast<api::job_update_request>(std::move(base_request));

    uint32_t jobid = request->get<0>();
    auto hosts = request->get<1>();
@@ -405,7 +405,7 @@ response_ptr urd::remove_job(const request_ptr base_request) {
    response_ptr resp = std::make_unique<api::job_unregister_response>();

    // downcast the generic request to the concrete implementation
    auto request = static_cast<api::job_unregister_request*>(base_request.get());
    auto request = utils::static_unique_ptr_cast<api::job_unregister_request>(std::move(base_request));

    uint32_t jobid = request->get<0>();

@@ -432,7 +432,7 @@ response_ptr urd::add_process(const request_ptr base_request) {
    response_ptr resp = std::make_unique<api::process_register_response>();

    // downcast the generic request to the concrete implementation
    auto request = static_cast<api::process_register_request*>(base_request.get());
    auto request = utils::static_unique_ptr_cast<api::process_register_request>(std::move(base_request));

    uint32_t jobid = request->get<0>();
    pid_t uid = request->get<1>();
@@ -462,7 +462,7 @@ response_ptr urd::remove_process(const request_ptr base_request) {
    response_ptr resp = std::make_unique<api::process_unregister_response>();

    // downcast the generic request to the concrete implementation
    auto request = static_cast<api::process_unregister_request*>(base_request.get());
    auto request = utils::static_unique_ptr_cast<api::process_unregister_request>(std::move(base_request));

    uint32_t jobid = request->get<0>();
    pid_t uid = request->get<1>();
@@ -495,7 +495,7 @@ response_ptr urd::register_backend(const request_ptr base_request) {
    response_ptr resp = std::make_unique<api::backend_register_response>();

    // downcast the generic request to the concrete implementation
    auto request = static_cast<api::backend_register_request*>(base_request.get());
    auto request = utils::static_unique_ptr_cast<api::backend_register_request>(std::move(base_request));

    std::string nsid = request->get<0>();
    int32_t type = request->get<1>();
@@ -532,7 +532,7 @@ response_ptr urd::update_backend(const request_ptr base_request) {
    response_ptr resp = std::make_unique<api::backend_update_response>();

    // downcast the generic request to the concrete implementation
    auto request = static_cast<api::backend_update_request*>(base_request.get());
    auto request = utils::static_unique_ptr_cast<api::backend_update_request>(std::move(base_request));

    resp->set_error_code(NORNS_SUCCESS);

@@ -546,7 +546,7 @@ response_ptr urd::remove_backend(const request_ptr base_request) {
    response_ptr resp = std::make_unique<api::backend_unregister_response>();

    // downcast the generic request to the concrete implementation
    auto request = static_cast<api::backend_unregister_request*>(base_request.get());
    auto request = utils::static_unique_ptr_cast<api::backend_unregister_request>(std::move(base_request));

    std::string nsid = request->get<0>();