Bypass alignment related copy whenever possible (#1443)
	
		
	
				
					
				
			remove blank lines add file messagehelp.h remove blank line simplify after reviewpull/214/head
							parent
							
								
									4857f45d6a
								
							
						
					
					
						commit
						b225016628
					
				
				 10 changed files with 95 additions and 121 deletions
			
			
		| @ -0,0 +1,42 @@ | |||||||
|  | #pragma once | ||||||
|  | #include <capnp/serialize.h> | ||||||
|  | 
 | ||||||
|  | #include "cereal/gen/cpp/log.capnp.h" | ||||||
|  | #include "messaging.hpp" | ||||||
|  | class MessageReader { | ||||||
|  |  public: | ||||||
|  |   MessageReader(Message *msg) : msg(msg), buf(nullptr), msg_reader(nullptr) {} | ||||||
|  |   ~MessageReader() { | ||||||
|  |     if (msg_reader) delete msg_reader; | ||||||
|  |     if (buf) free(buf); | ||||||
|  |     if (msg) delete msg; | ||||||
|  |   } | ||||||
|  |   inline operator bool() { return msg != NULL; } | ||||||
|  |   inline const char* getData() { return msg->getData(); } | ||||||
|  |   inline size_t getSize() { return msg->getSize(); } | ||||||
|  |   cereal::Event::Reader &getEvent() { | ||||||
|  |     if (!msg_reader) { | ||||||
|  |       msg_reader = newReader(); | ||||||
|  |       event = msg_reader->getRoot<cereal::Event>(); | ||||||
|  |     } | ||||||
|  |     return event; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |  private: | ||||||
|  |   capnp::FlatArrayMessageReader *newReader() { | ||||||
|  |     const char *data = msg->getData(); | ||||||
|  |     const size_t size = msg->getSize(); | ||||||
|  |     if (((reinterpret_cast<uintptr_t>(data)) % sizeof(capnp::word) == 0) && size % sizeof(capnp::word) == 0) { | ||||||
|  |       return new capnp::FlatArrayMessageReader(kj::ArrayPtr<capnp::word>((capnp::word *)data, size / sizeof(capnp::word))); | ||||||
|  |     } else { | ||||||
|  |       const size_t words = size / sizeof(capnp::word) + 1; | ||||||
|  |       buf = (capnp::word *)malloc(words * sizeof(capnp::word)); | ||||||
|  |       memcpy(buf, data, size); | ||||||
|  |       return new capnp::FlatArrayMessageReader(kj::ArrayPtr<capnp::word>(buf, words)); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |   capnp::word *buf; | ||||||
|  |   Message *msg; | ||||||
|  |   capnp::FlatArrayMessageReader *msg_reader; | ||||||
|  |   cereal::Event::Reader event; | ||||||
|  | }; | ||||||
					Loading…
					
					
				
		Reference in new issue