1*11c03c6dSDamjan Jovanovic /************************************************************** 2*11c03c6dSDamjan Jovanovic * 3*11c03c6dSDamjan Jovanovic * Licensed to the Apache Software Foundation (ASF) under one 4*11c03c6dSDamjan Jovanovic * or more contributor license agreements. See the NOTICE file 5*11c03c6dSDamjan Jovanovic * distributed with this work for additional information 6*11c03c6dSDamjan Jovanovic * regarding copyright ownership. The ASF licenses this file 7*11c03c6dSDamjan Jovanovic * to you under the Apache License, Version 2.0 (the 8*11c03c6dSDamjan Jovanovic * "License"); you may not use this file except in compliance 9*11c03c6dSDamjan Jovanovic * with the License. You may obtain a copy of the License at 10*11c03c6dSDamjan Jovanovic * 11*11c03c6dSDamjan Jovanovic * http://www.apache.org/licenses/LICENSE-2.0 12*11c03c6dSDamjan Jovanovic * 13*11c03c6dSDamjan Jovanovic * Unless required by applicable law or agreed to in writing, 14*11c03c6dSDamjan Jovanovic * software distributed under the License is distributed on an 15*11c03c6dSDamjan Jovanovic * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*11c03c6dSDamjan Jovanovic * KIND, either express or implied. See the License for the 17*11c03c6dSDamjan Jovanovic * specific language governing permissions and limitations 18*11c03c6dSDamjan Jovanovic * under the License. 19*11c03c6dSDamjan Jovanovic * 20*11c03c6dSDamjan Jovanovic *************************************************************/ 21*11c03c6dSDamjan Jovanovic 22*11c03c6dSDamjan Jovanovic 23*11c03c6dSDamjan Jovanovic 24*11c03c6dSDamjan Jovanovic #ifndef CSV_TPL_PROCESSOR_HXX 25*11c03c6dSDamjan Jovanovic #define CSV_TPL_PROCESSOR_HXX 26*11c03c6dSDamjan Jovanovic 27*11c03c6dSDamjan Jovanovic // USED SERVICES 28*11c03c6dSDamjan Jovanovic 29*11c03c6dSDamjan Jovanovic 30*11c03c6dSDamjan Jovanovic 31*11c03c6dSDamjan Jovanovic 32*11c03c6dSDamjan Jovanovic namespace csv 33*11c03c6dSDamjan Jovanovic { 34*11c03c6dSDamjan Jovanovic 35*11c03c6dSDamjan Jovanovic 36*11c03c6dSDamjan Jovanovic /** Implements an acyclic visitor pattern. This is the abstract 37*11c03c6dSDamjan Jovanovic base for the classes doing the work (the "visitors"). 38*11c03c6dSDamjan Jovanovic */ 39*11c03c6dSDamjan Jovanovic class ProcessorIfc 40*11c03c6dSDamjan Jovanovic { 41*11c03c6dSDamjan Jovanovic public: 42*11c03c6dSDamjan Jovanovic virtual ~ProcessorIfc() {} 43*11c03c6dSDamjan Jovanovic }; 44*11c03c6dSDamjan Jovanovic 45*11c03c6dSDamjan Jovanovic 46*11c03c6dSDamjan Jovanovic 47*11c03c6dSDamjan Jovanovic /** Implements an acyclic visitor pattern. This is the abstract 48*11c03c6dSDamjan Jovanovic base for the classes to be processed (the "visitables"). 49*11c03c6dSDamjan Jovanovic */ 50*11c03c6dSDamjan Jovanovic class ConstProcessorClient 51*11c03c6dSDamjan Jovanovic { 52*11c03c6dSDamjan Jovanovic public: 53*11c03c6dSDamjan Jovanovic virtual ~ConstProcessorClient() {} 54*11c03c6dSDamjan Jovanovic 55*11c03c6dSDamjan Jovanovic void Accept( 56*11c03c6dSDamjan Jovanovic ProcessorIfc & io_processor ) const 57*11c03c6dSDamjan Jovanovic { do_Accept(io_processor); } 58*11c03c6dSDamjan Jovanovic private: 59*11c03c6dSDamjan Jovanovic virtual void do_Accept( 60*11c03c6dSDamjan Jovanovic ProcessorIfc & io_processor ) const = 0; 61*11c03c6dSDamjan Jovanovic }; 62*11c03c6dSDamjan Jovanovic 63*11c03c6dSDamjan Jovanovic /** Implements an acyclic visitor pattern. This is the abstract 64*11c03c6dSDamjan Jovanovic base for the classes to be processed (the "visitables"). 65*11c03c6dSDamjan Jovanovic */ 66*11c03c6dSDamjan Jovanovic class ProcessorClient 67*11c03c6dSDamjan Jovanovic { 68*11c03c6dSDamjan Jovanovic public: 69*11c03c6dSDamjan Jovanovic virtual ~ProcessorClient() {} 70*11c03c6dSDamjan Jovanovic 71*11c03c6dSDamjan Jovanovic void Accept( 72*11c03c6dSDamjan Jovanovic ProcessorIfc & io_processor ) 73*11c03c6dSDamjan Jovanovic { do_Accept(io_processor); } 74*11c03c6dSDamjan Jovanovic private: 75*11c03c6dSDamjan Jovanovic virtual void do_Accept( 76*11c03c6dSDamjan Jovanovic ProcessorIfc & io_processor ) = 0; 77*11c03c6dSDamjan Jovanovic }; 78*11c03c6dSDamjan Jovanovic 79*11c03c6dSDamjan Jovanovic 80*11c03c6dSDamjan Jovanovic 81*11c03c6dSDamjan Jovanovic 82*11c03c6dSDamjan Jovanovic 83*11c03c6dSDamjan Jovanovic /** Typed base for "visitor" classes, leaving the visited 84*11c03c6dSDamjan Jovanovic object const. 85*11c03c6dSDamjan Jovanovic 86*11c03c6dSDamjan Jovanovic @see ProcessorIfc 87*11c03c6dSDamjan Jovanovic @see Processor<> 88*11c03c6dSDamjan Jovanovic */ 89*11c03c6dSDamjan Jovanovic template <typename X, typename R = void> 90*11c03c6dSDamjan Jovanovic class ConstProcessor 91*11c03c6dSDamjan Jovanovic { 92*11c03c6dSDamjan Jovanovic public: 93*11c03c6dSDamjan Jovanovic virtual ~ConstProcessor() {} 94*11c03c6dSDamjan Jovanovic 95*11c03c6dSDamjan Jovanovic R Process( 96*11c03c6dSDamjan Jovanovic const X & i_object ) 97*11c03c6dSDamjan Jovanovic { return do_Process(i_object ); } 98*11c03c6dSDamjan Jovanovic private: 99*11c03c6dSDamjan Jovanovic virtual R do_Process( 100*11c03c6dSDamjan Jovanovic const X & i_object ) = 0; 101*11c03c6dSDamjan Jovanovic }; 102*11c03c6dSDamjan Jovanovic 103*11c03c6dSDamjan Jovanovic 104*11c03c6dSDamjan Jovanovic /** Typed base for "visitor" classes which may change the visited 105*11c03c6dSDamjan Jovanovic object. 106*11c03c6dSDamjan Jovanovic 107*11c03c6dSDamjan Jovanovic @see ProcessorIfc 108*11c03c6dSDamjan Jovanovic @see ConstProcessor<> 109*11c03c6dSDamjan Jovanovic */ 110*11c03c6dSDamjan Jovanovic template <typename X, typename R = void> 111*11c03c6dSDamjan Jovanovic class Processor 112*11c03c6dSDamjan Jovanovic { 113*11c03c6dSDamjan Jovanovic public: 114*11c03c6dSDamjan Jovanovic virtual ~Processor() {} 115*11c03c6dSDamjan Jovanovic 116*11c03c6dSDamjan Jovanovic R Process( 117*11c03c6dSDamjan Jovanovic X & i_object ) 118*11c03c6dSDamjan Jovanovic { return do_Process(i_object ); } 119*11c03c6dSDamjan Jovanovic private: 120*11c03c6dSDamjan Jovanovic virtual R do_Process( 121*11c03c6dSDamjan Jovanovic X & i_object ) = 0; 122*11c03c6dSDamjan Jovanovic }; 123*11c03c6dSDamjan Jovanovic 124*11c03c6dSDamjan Jovanovic 125*11c03c6dSDamjan Jovanovic template <class C> 126*11c03c6dSDamjan Jovanovic inline void 127*11c03c6dSDamjan Jovanovic CheckedCall( ProcessorIfc & io_processor, 128*11c03c6dSDamjan Jovanovic const C & i_client ) 129*11c03c6dSDamjan Jovanovic { 130*11c03c6dSDamjan Jovanovic ConstProcessor<C> * 131*11c03c6dSDamjan Jovanovic pProcessor = dynamic_cast< csv::ConstProcessor<C> * > 132*11c03c6dSDamjan Jovanovic (&io_processor); 133*11c03c6dSDamjan Jovanovic if (pProcessor != 0) 134*11c03c6dSDamjan Jovanovic pProcessor->Process(i_client); 135*11c03c6dSDamjan Jovanovic } 136*11c03c6dSDamjan Jovanovic 137*11c03c6dSDamjan Jovanovic template <class C> 138*11c03c6dSDamjan Jovanovic inline void 139*11c03c6dSDamjan Jovanovic CheckedCall( ProcessorIfc & io_processor, 140*11c03c6dSDamjan Jovanovic C & io_client ) 141*11c03c6dSDamjan Jovanovic { 142*11c03c6dSDamjan Jovanovic Processor<C> * 143*11c03c6dSDamjan Jovanovic pProcessor = dynamic_cast< csv::Processor<C> * > 144*11c03c6dSDamjan Jovanovic (&io_processor); 145*11c03c6dSDamjan Jovanovic if (pProcessor != 0) 146*11c03c6dSDamjan Jovanovic pProcessor->Process(io_client); 147*11c03c6dSDamjan Jovanovic } 148*11c03c6dSDamjan Jovanovic 149*11c03c6dSDamjan Jovanovic template <class C> 150*11c03c6dSDamjan Jovanovic inline void 151*11c03c6dSDamjan Jovanovic AssertedCall( ProcessorIfc & io_processor, 152*11c03c6dSDamjan Jovanovic const C & i_client ) 153*11c03c6dSDamjan Jovanovic { 154*11c03c6dSDamjan Jovanovic ConstProcessor<C> * 155*11c03c6dSDamjan Jovanovic pProcessor = dynamic_cast< csv::ConstProcessor<C> * > 156*11c03c6dSDamjan Jovanovic (&io_processor); 157*11c03c6dSDamjan Jovanovic csv_assert( pProcessor != 0 158*11c03c6dSDamjan Jovanovic && "csv::AssertedCall() failed. Processed object did not match processor." ); 159*11c03c6dSDamjan Jovanovic pProcessor->Process(i_client); 160*11c03c6dSDamjan Jovanovic } 161*11c03c6dSDamjan Jovanovic 162*11c03c6dSDamjan Jovanovic template <class C> 163*11c03c6dSDamjan Jovanovic inline void 164*11c03c6dSDamjan Jovanovic AssertedCall( ProcessorIfc & io_processor, 165*11c03c6dSDamjan Jovanovic C & io_client ) 166*11c03c6dSDamjan Jovanovic { 167*11c03c6dSDamjan Jovanovic Processor<C> * 168*11c03c6dSDamjan Jovanovic pProcessor = dynamic_cast< csv::Processor<C> * > 169*11c03c6dSDamjan Jovanovic (&io_processor); 170*11c03c6dSDamjan Jovanovic csv_assert( pProcessor != 0 171*11c03c6dSDamjan Jovanovic && "csv::AssertedCall() failed. Processed object did not match processor." ); 172*11c03c6dSDamjan Jovanovic pProcessor->Process(io_client); 173*11c03c6dSDamjan Jovanovic } 174*11c03c6dSDamjan Jovanovic 175*11c03c6dSDamjan Jovanovic 176*11c03c6dSDamjan Jovanovic 177*11c03c6dSDamjan Jovanovic 178*11c03c6dSDamjan Jovanovic } // namespace csv 179*11c03c6dSDamjan Jovanovic #endif 180