Xinqi Bao's Git

README.md: updated paper url
[XbSlicer.git] / src / BufferWrite.cc
1 /*
2 Buffer for writing
3 */
4 #include "BufferWrite.hh"
5
6 #include <fcntl.h>
7 #include <stdio.h>
8 #include <sys/stat.h>
9 #include <unistd.h>
10
11 #include <string>
12
13 BufferWrite::BufferWrite(std::string& fileTarget)
14 {
15 buffer = new char[BUFFER_SIZE + POSTBUFFER_SIZE];
16 postbuffer = buffer + BUFFER_SIZE;
17 phead = buffer;
18 remove(fileTarget.c_str());
19 creat(fileTarget.c_str(), S_IREAD | S_IWRITE);
20 fn = open(fileTarget.c_str(), O_WRONLY | O_APPEND);
21 }
22 BufferWrite::~BufferWrite()
23 {
24 flush();
25 delete[] buffer;
26 close(fn);
27 }
28
29 void BufferWrite::flushOnlyBuffer()
30 {
31 size_t size = write(fn, buffer, BUFFER_SIZE);
32 // copy the stuff in postbuffer to buffer
33 for (int i = 0; i < phead - postbuffer; i++) buffer[i] = postbuffer[i];
34 phead -= BUFFER_SIZE;
35 }
36
37 void BufferWrite::writeG0(double x, double y)
38 {
39 *this << "G0 F4800 X" << x << " Y" << y << '\n';
40 if (phead >= postbuffer) flushOnlyBuffer();
41 }
42 void BufferWrite::writeG1(double x, double y, double e)
43 {
44 *this << "G1 F2000 X" << x << " Y" << y << " E" << e << '\n';
45 if (phead >= postbuffer) flushOnlyBuffer();
46 }
47 void BufferWrite::flush()
48 {
49 uint32_t sizeToWrite = phead - buffer;
50 size_t size = write(fn, buffer, sizeToWrite);
51 phead = buffer;
52 }
53
54 BufferWrite& operator<<(BufferWrite& buf, const char* ch)
55 {
56 // check buffer is full or not. If full, only flush the buffer
57 for (int i = 0; ch[i] != '\0'; i++, buf.phead++) *buf.phead = ch[i];
58 return buf;
59 }
60 BufferWrite& operator<<(BufferWrite& buf, char ch)
61 {
62 *buf.phead = ch;
63 buf.phead++;
64 return buf;
65 }
66 BufferWrite& operator<<(BufferWrite& buf, std::string& str)
67 {
68 return buf << str.c_str();
69 }
70 BufferWrite& operator<<(BufferWrite& buf, double val)
71 {
72 #if 0
73 //TODO: translating double to string REALLY take so much time!!!
74 //TODO: make our own doubleToString()
75 //snprintf(buf.phead, 9, "%lf", val);
76 //buf.phead += 9;
77 std::string str = std::to_string(val);
78 return buf << str;
79 #endif
80 #if 1 // faster way for DoubleToString
81 buf.phead = formatDouble(val, buf.phead);
82 return buf;
83 #endif
84 }