source: branches/hpc33/src/Accelerator.h @ 2458

Last change on this file since 2458 was 2458, checked in by KohjiNakamura, 12 years ago

make CustomTableExprNode? versatile

File size: 1.9 KB
Line 
1#ifndef ASAPACCELERATOR_H
2#define ASAPACCELERATOR_H
3//
4// C++ Interface: CustomTableExprNode
5//
6// Description:
7//      Various utilities for speed.
8//
9// Author: Kohji Nakamura <k.nakamura@nao.ac.jp>, (C) 2012
10//
11// Copyright: See COPYING file that comes with this distribution
12//
13//
14
15#include <tables/Tables/ExprNode.h>
16#include <tables/Tables/ScalarColumn.h>
17
18namespace asap {
19
20using namespace casa;
21
22class CustomTableExprNodeRep :public TableExprNodeRep {
23public:
24        CustomTableExprNodeRep(const Table &table)
25        :TableExprNodeRep(TableExprNodeRep::NTBool,
26                TableExprNodeRep::VTScalar,
27                TableExprNodeRep::OtUndef,
28                table) {}
29};
30
31class TableExprPredicate {
32public:
33        virtual ~TableExprPredicate() {}
34        virtual Bool match(Table const& table, const TableExprId& id) const = 0;
35};
36
37class CustomTableExprNode: public TableExprNode {
38        CustomTableExprNodeRep const nodeRep;
39        TableExprPredicate const & pred_;
40public:
41        CustomTableExprNode(Table const &table, TableExprPredicate const &pred)
42        : TableExprNode(), nodeRep(table), pred_(pred) {
43        }
44        virtual ~CustomTableExprNode() {
45        }
46        const TableExprNodeRep* getNodeRep() const {
47                return &nodeRep;
48        }
49        void get(const TableExprId& id, Bool& value) const {
50                value = pred_.match(nodeRep.table(), id);
51        }
52};
53
54template<typename T, size_t N>
55class SingleTypeEqPredicate: public TableExprPredicate {
56        Table const & table;
57        ROScalarColumn<T> *cols[N];
58        T const *values;
59public:
60        SingleTypeEqPredicate(Table const &table_,
61                char const*const colNames[],
62                T const values_[]):
63                        table(table_), values(values_) {
64                for (size_t i = 0; i < N; i++) {
65                        cols[i] = new ROScalarColumn<T>(table, colNames[i]);
66                }
67        }
68        virtual ~SingleTypeEqPredicate() {
69                for (size_t i = 0; i < N; i++) {
70                        delete cols[i];
71                }
72        }
73        virtual Bool match(Table const& table, const TableExprId& id) const {
74                for (size_t i = 0; i < N; i++) {
75                        T v;
76                        cols[i]->get(id.rownr(), v);
77                        if (v != values[i]) {
78                                return false;
79                        }
80                }
81                return true;
82        }
83};
84
85} // asap
86
87#endif // ASAPACCELERATOR_H
Note: See TracBrowser for help on using the repository browser.