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

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

make CustomTableExprNode versatile

File size: 1.9 KB
RevLine 
[2458]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.