class DeviceReader {
public:
// Reads upto 4 bytes of data into the given buffer.
// Returns the number of bytes read (zero if no more data).
virtual int read4(char *buffer) = 0;
};
/*
--- simple example ---
data -> a b c d e f g h i j
read4 - buffer = a b c d = > return 4
read4 - e f g h => 4
read4 - i j => 2
*/
class Reader {
public:
Reader(DeviceReader *deviceReader) : deviceReader_(deviceReader) {}
// Reads up to bufSize bytes of data into buffer.
// Returns the number of bytes read (zero if no more data).
// TODO: Implement, buffer allocated by caller, bufSize can be <4, 4 or > 4
int read(char *buffer, int bufSize) {
// use deviceReader_.read4
}
char temp[4];
private:
DeviceReader *deviceReader_;
// TODO: Any additional members
};
int Reader::read(char* buffer, int bufSize){
if(buffer==NULL)
return 0;
char* p = buffer;
int cnt = bufSize;
//before read4, I shall move the chars in temp to buffer
while(cnt>=4){
int len = deviceReader_->read4(temp);
p+=len;
if(len<4)
return bufSize-cnt+len;
cnt-=4;
}
char s[4];
int len = deviceReader_->read4(temp);
int i=0;
//cnt=3 len=2
for(;i<len && i<cnt;i++)
p[i] = s[i];
p[i] = '\0';
return bufSize-cnt+min(len,cnt);
}
------ test case 1 ---
// assume device reader is reading over -> a b c d e f g h i j
Reader r;
char buf[1024];
char temp[4];
int x;
x = r.read(buf, 2);
EXPECT(x == 2);
EXPECT(buf[0] == 'a');
EXPECT(buf[1] == 'b');
x = r.read(buf, 5);
EXPECT(x == 5);
EXPECT(buf[0] == 'c');
EXPECT(buf[1] == 'd');
EXPECT(buf[2] == 'e');
EXPECT(buf[3] == 'f');
EXPECT(buf[4] == 'g');
x = r.read(buf, 1024);
EXPECT(x == 3);
EXPECT(buf[0] == 'h');
EXPECT(buf[1] == 'i');
EXPECT(buf[2] == 'j');
x = r.read(buf, 4);
EXPECT(x == 0);
class DeviceReader { public: // Reads upto 4 bytes of data into the given buffer. // Returns the number of bytes read (zero if no more data). virtual int read4(char *buffer) = 0;};/*--- s