| #ifndef ECC_H_ | 
 | #define ECC_H_ | 
 |  | 
 | #include <cstdint> | 
 | #include <string> | 
 | #include <unordered_map> | 
 | #include <vector> | 
 |  | 
 | class ECC { | 
 |        public: | 
 | 	ECC(const std::string& architecture, size_t words_per_frame) | 
 | 	    : architecture_(architecture), | 
 | 	      frame_words_(words_per_frame), | 
 | 	      ecc_word_(ecc_word_per_architecture.at(architecture)) {} | 
 |  | 
 | 	void UpdateFrameECC(std::vector<uint32_t>& data) const; | 
 |  | 
 |        private: | 
 | 	const std::string architecture_; | 
 | 	const size_t frame_words_; | 
 | 	const size_t ecc_word_; | 
 | 	static const std::unordered_map<std::string, size_t> | 
 | 	    ecc_word_per_architecture; | 
 |  | 
 | 	uint64_t CalculateECC(const std::vector<uint32_t>& words) const; | 
 | 	uint64_t GetUSEccFrameOffset(int word, int bit) const; | 
 | 	uint32_t GetSeries7WordEcc(uint32_t idx, | 
 | 	                           uint32_t data, | 
 | 	                           uint32_t ecc) const; | 
 | 	uint64_t GetUSWordEcc(uint32_t idx, uint32_t data, uint64_t ecc) const; | 
 | }; | 
 |  | 
 | #endif  // ECC_H_ |