Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef _Cache_
00023 #define _Cache_
00024
00025 #include <iosfwd>
00026
00027 namespace PIRL
00028 {
00063 class Cache
00064 {
00065 public:
00066
00067
00068
00074 typedef bool (*Data_Test) (const void*);
00075
00076
00077
00078
00080 static const char* const
00081 ID;
00082
00083
00084
00085
00091 Cache ();
00092
00106 explicit Cache
00107 (
00108 unsigned long capacity,
00109 unsigned long data_margin = 0,
00110 Data_Test data_test = NULL
00111 );
00112
00126 Cache
00127 (
00128 unsigned long capacity,
00129 std::istream& source,
00130 unsigned long data_margin = 0,
00131 Data_Test data_test = NULL
00132 );
00133
00138 virtual ~Cache ();
00139
00140 private:
00141
00142 Cache (const Cache& cache);
00143 Cache& operator= (const Cache& cache);
00144
00145
00146
00147
00148 public:
00158 Cache& source (std::istream& source)
00159 {Source = &source; return *this;}
00160
00165 std::istream& source () const
00166 {return *Source;}
00167
00178 unsigned long long bytes_read () const
00179 {return Bytes_Read;}
00180
00201 Cache& data_margin (unsigned long amount);
00202
00216 unsigned long data_margin () const
00217 {return
00218 (Data_Test_Amount &&
00219 (Data_Test_Amount - 1) > Data_Margin) ?
00220 (Data_Test_Amount - 1) : Data_Margin;}
00221
00257 Cache& data_test (Data_Test tester, unsigned long data_amount);
00258
00265 Data_Test data_test () const
00266 {return EOD_Test;}
00267
00272 unsigned long data_test_amount () const
00273 {return Data_Test_Amount;}
00274
00275
00276
00277
00297 virtual void drain ();
00298
00350 virtual bool refill (unsigned long max_amount = (unsigned long)-1);
00351
00367 virtual Cache& put (char* data, unsigned long amount);
00368
00385 virtual unsigned long get (char* data, unsigned long amount);
00386
00391 virtual void reset ();
00392
00393
00394
00395
00406 unsigned long capacity () const
00407 {return Capacity;}
00408
00444 Cache& capacity (unsigned long amount);
00445
00450 unsigned long amount_used () const
00451 {return Last - Start;}
00452
00462 unsigned long amount_free () const
00463 {return End - Last;}
00464
00472 char* start () const
00473 {return Start;}
00474
00496 Cache& next (char* location)
00497 {Next = (location > Start) ? location : Start; return *this;}
00498
00508 char* next () const
00509 {return Next;}
00510
00520 unsigned long amount_consumed () const
00521 {return Next - Start;}
00522
00532 long amount_remaining () const
00533 {return Last - Next;}
00534
00541 char* last () const
00542 {return Last;}
00543
00554 Cache& last (char* location);
00555
00560 void state_report (std::ostream& stream) const;
00561
00569 void state_report () const;
00570
00571
00572
00573
00574 private:
00576 std::istream*
00577 Source;
00578
00580 unsigned long long
00581 Bytes_Read;
00582
00584 unsigned long
00585 Data_Margin;
00586
00588 Data_Test
00589 EOD_Test;
00590
00592 unsigned long
00593 Data_Test_Amount;
00594
00596 unsigned long
00597 Capacity;
00598
00599
00600
00602 char*
00603 Start;
00605 char*
00606 Next;
00608 char*
00609 Last;
00611 char*
00612 End;
00613
00614 };
00615 }
00616 #endif