source: projects/punch-card/lib/card.h @ 40

Last change on this file since 40 was 40, checked in by sven, 10 years ago

Some first implemention of the Jones I/O Format.
Todo: Clean it all up

-- sven @ t29

File size: 3.9 KB
Line 
1/*
2 die drei klassen:
3   Punch::Card
4   Punch::CardColumn
5   Punch::Bit
6*/
7
8#include <iostream>
9#include <list>
10
11typedef unsigned char byte_t;
12
13namespace Punch {
14
15class CardBit {
16public:
17        // the common meaing of these bits:
18        static const bool hole = true;
19        static const bool no_hole = false;
20        static const bool default_value = false;
21
22        // well, this is the real content: :-)
23        bool value;
24
25        CardBit() : value(default_value) {}
26        CardBit(bool value) : value(value) {}
27        CardBit(int value) { this->value = value?true:false; }
28
29        void set(bool value) { this->value = value; }
30        bool get() { return value; }
31
32        void invert() { value = !value; }
33
34        // wird von bool casting uebernommen
35        //CardBit operator!() { return CardBit(!value); }
36        CardBit& operator=(const CardBit& a) {
37                value=a.value; return *this; }
38        operator bool() const { return value; }
39};
40
41// to make sure:
42static const int  hole_1 =  1;
43static const int  hole_2 =  2;
44static const int  hole_3 =  3;
45static const int  hole_4 =  4;
46static const int  hole_5 =  5;
47static const int  hole_6 =  6;
48static const int  hole_7 =  7;
49static const int  hole_8 =  8;
50static const int  hole_9 =  9;
51static const int  hole_0 =  0;
52static const int hole_11 = 10;
53static const int hole_12 = 11;
54
55class CardWord {
56public:
57        static const int word_length = 12;
58        Punch::CardBit bits[ word_length ];
59
60        CardWord(int value) {
61                for(s=0; s<word_length; s++) {
62                        set(s, (value << s) & 0x01);
63                }
64        }
65
66
67        // getters and setters
68        void set(int pos, const CardBit& value) { bits[pos]=value; }
69        void set(const CardBit&  bit0,
70                 const CardBit&  bit1,
71                 const CardBit&  bit2,
72                 const CardBit&  bit3,
73                 const CardBit&  bit4,
74                 const CardBit&  bit5,
75                 const CardBit&  bit6,
76                 const CardBit&  bit7,
77                 const CardBit&  bit8,
78                 const CardBit&  bit9,
79                 const CardBit& bit10,
80                 const CardBit& bit11) {
81                bits[0] = bit0; bits[1] = bit1; bits[2] = bit2;
82                bits[3] = bit3; bits[4] = bit4; bits[5] = bit5;
83                bits[6] = bit6; bits[7] = bit7; bits[8] = bit8;
84                bits[9] = bit9; bits[10] = bit10; bits[11] = bit11;
85        }
86        CardBit& get(int pos) {
87                if(pos<0||pos>word_length) throw "Out of range";
88                return bits[pos]; }
89
90        void print(std::ostream& os) const;
91
92        CardBit& operator[](int x) { return get(x); }
93
94        const CardWord operator&(const CardWord& right) const {
95                CardWord result = *this;
96                for(int x=0; x<word_length; x++)
97                        result[x].value &= right.bits[x].value;
98                return result;
99        }
100
101        const CardWord operator|(const CardWord& right) const {
102                CardWord result = *this;
103                for(int x=0; x<word_length; x++)
104                        result[x].value |= right.bits[x].value;
105                return result;
106        }
107
108        const CardWord operator^(const CardWord& right) const {
109                CardWord result = *this;
110                for(int x=0; x<word_length; x++)
111                        result[x].value ^= right.bits[x].value;
112                return result;
113        }
114
115        const CardWord operator<<(const int& right) const {
116                CardWord result;
117                // source, target fields
118                for(int s=0,t=-right; s<word_length; s++,t++) {
119                        // make it cyclic
120                        if(t < 0) t += word_length;
121                        if(t >= word_length) t -= word_length;
122                        result[t] = bits[s];
123                }
124                return result;
125        }
126
127        const CardWord operator>>(const int& right) const {
128                return operator<<(-right);
129        }
130
131        // cast word => int
132        operator int() const {
133                int ret = 0;
134                for(int s=0; s<word_length; s++) {
135                        ret |= get(s) << s;
136                }
137        }
138}; // class CardWord
139
140class Card {
141public:
142        static const int col_length = 80;
143        Punch::CardWord word[ col_length ];
144
145        // initialize blanco card
146        Card() {}
147        // read in card from some stream
148        Card(CardFormat format, std::istream& is) {
149                this->read(format, is); }
150
151        // this will copy your word
152        void set(int col, const CardWord& word) {
153                this->word[col] = word; }
154
155        // iteratoren
156        //CardWordIterator start();
157        //CardWordIterator end();
158
159        void print(std::ostream& os) const;
160};
161
162typedef enum {
163        JONES_FORMAT,
164        ASCII_FORMAT
165} CardFormat;
166
167class CardFile {
168public:
169        int default_col_length = 80;
170
171        public list<Punch::Card> cards;
172        void write(CardFormat format, std::ostream& os);
173        bool read(CardFormat format, std::istream& is);
174}
175
176
177} // namespace
Note: See TracBrowser for help on using the repository browser.
© 2008 - 2013 technikum29 • Sven Köppel • Some rights reserved
Powered by Trac
Expect where otherwise noted, content on this site is licensed under a Creative Commons 3.0 License