GNU Octave  3.8.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
BlockArray.h
Go to the documentation of this file.
1 /*
2  This file is part of Konsole, an X terminal.
3  Copyright (C) 2000, 2013 by Stephan Kulow <[email protected]>
4 
5  Rewritten for QT4 by e_k <e_k at users.sourceforge.net>, Copyright (C)2008
6 
7  This program is free software; you can redistribute it and/or modify
8  it under the terms of the GNU General Public License as published by
9  the Free Software Foundation; either version 2 of the License, or
10  (at your option) any later version.
11 
12  This program is distributed in the hope that it will be useful,
13  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  GNU General Public License for more details.
16 
17  You should have received a copy of the GNU General Public License
18  along with this program; if not, write to the Free Software
19  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
20  02110-1301 USA.
21 */
22 
23 #ifndef BLOCKARRAY_H
24 #define BLOCKARRAY_H
25 
26 #include <unistd.h>
27 
28 #define BlockSize (1 << 12)
29 #define ENTRIES ((BlockSize - sizeof(size_t) ) / sizeof(unsigned char))
30 
31 struct Block {
32  Block() { size = 0; }
33  unsigned char data[ENTRIES];
34  size_t size;
35 };
36 
37 // ///////////////////////////////////////////////////////
38 
39 class BlockArray {
40 public:
41  /**
42  * Creates a history file for holding
43  * maximal size blocks. If more blocks
44  * are requested, then it drops earlier
45  * added ones.
46  */
47  BlockArray();
48 
49  /// destructor
50  ~BlockArray();
51 
52  /**
53  * adds the Block at the end of history.
54  * This may drop other blocks.
55  *
56  * The ownership on the block is transfered.
57  * An unique index number is returned for accessing
58  * it later (if not yet dropped then)
59  *
60  * Note, that the block may be dropped completely
61  * if history is turned off.
62  */
63  size_t append(Block *block);
64 
65  /**
66  * gets the block at the index. Function may return
67  * 0 if the block isn't available any more.
68  *
69  * The returned block is strictly readonly as only
70  * maped in memory - and will be invalid on the next
71  * operation on this class.
72  */
73  const Block *at(size_t index);
74 
75  /**
76  * reorders blocks as needed. If newsize is null,
77  * the history is emptied completely. The indices
78  * returned on append won't change their semantic,
79  * but they may not be valid after this call.
80  */
81  bool setHistorySize(size_t newsize);
82 
83  size_t newBlock();
84 
85  Block *lastBlock() const;
86 
87  /**
88  * Convenient function to set the size in KBytes
89  * instead of blocks
90  */
91  bool setSize(size_t newsize);
92 
93  size_t len() const { return length; }
94 
95  bool has(size_t index) const;
96 
97  size_t getCurrent() const { return current; }
98 
99 private:
100  void unmap();
101  void increaseBuffer();
102  void decreaseBuffer(size_t newsize);
103 
104  size_t size;
105  // current always shows to the last inserted block
106  size_t current;
107  size_t index;
108 
112 
113  int ion;
114  size_t length;
115 
116 };
117 
118 #endif