21.10.2021, 9:00 - 11:00: Due to updates GitLab may be unavailable for some minutes between 09:00 and 11:00.

pipelinefactory.cpp 2.7 KB
Newer Older
1
2
3
4
// ================================================================================================
// 
// This file is part of the CAMPVis Software Framework.
// 
5
// If not explicitly stated otherwise: Copyright (C) 2012-2014, all rights reserved,
6
7
//      Christian Schulte zu Berge <christian.szb@in.tum.de>
//      Chair for Computer Aided Medical Procedures
8
9
//      Technische Universitaet Muenchen
//      Boltzmannstr. 3, 85748 Garching b. Muenchen, Germany
10
// 
11
12
// For a full list of authors and contributors, please refer to the file "AUTHORS.txt".
// 
13
14
15
16
// 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
17
// 
18
19
20
21
// 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.
22
23
24
25
// 
// ================================================================================================

#include "pipelinefactory.h"
26
#include "gen_pipelineregistration.h"
27
28
29
30
31
32
33
34

#include <sstream>

namespace campvis {

    // declare one single symbol for the PipelineFactory singleton
    tbb::atomic<PipelineFactory*> PipelineFactory::_singleton;

35
36
37
38
39
40
41
    PipelineFactory& PipelineFactory::getRef() {
        if (_singleton == 0) {
            std::cout << "creating PipelineFactory...\n";
            PipelineFactory* tmp = new PipelineFactory();
            if (_singleton.compare_and_swap(tmp, 0) != 0) {
                delete tmp;
            }
42
        }
43
44
45

        return *_singleton;
    }
46
47
    
    void PipelineFactory::deinit() {
48
        delete _singleton;
49
        _singleton = nullptr;
50
51
    }

52
53
54
55
56
57

    std::vector<std::string> PipelineFactory::getRegisteredPipelines() const {
        tbb::spin_mutex::scoped_lock lock(_mutex);

        std::vector<std::string> toReturn;
        toReturn.reserve(_pipelineMap.size());
58
        for (std::map< std::string, std::function<AbstractPipeline*(DataContainer*)> >::const_iterator it = _pipelineMap.begin(); it != _pipelineMap.end(); ++it)
59
60
61
62
63
64
65
            toReturn.push_back(it->first);
        return toReturn;
    }

    AbstractPipeline* PipelineFactory::createPipeline(const std::string& id, DataContainer* dc) const {
        tbb::spin_mutex::scoped_lock lock(_mutex);

66
        std::map< std::string, std::function<AbstractPipeline*(DataContainer*)> >::const_iterator it = _pipelineMap.find(id);
67
68
69
70
        if (it == _pipelineMap.end())
            return 0;
        else
            return (it->second)(dc);
71
72
    }

73
}