/** * @file * @brief Custom iterators for CAN controllers. */ #ifndef STA_CORE_CAN_ITER_HPP #define STA_CORE_CAN_ITER_HPP #include namespace sta { /** * @brief Iterable container interface for CAN RX flags. * * @ingroup sta_core_can_ids */ class CanPendingRxFifos { public: using value_type = uint8_t; using reference = value_type &; using const_reference = const value_type &; using size_type = uint8_t; /** * @brief Custom iterator for active RX queues. */ class const_iterator { public: using value_type = CanPendingRxFifos::value_type; using reference = const_reference; using pointer = const value_type *; public: const_iterator(const const_iterator & iter); const_iterator & operator=(const const_iterator & iter); bool operator==(const const_iterator & iter) const; bool operator!=(const const_iterator & iter) const; const_iterator & operator++(); const_iterator operator++(int); reference operator*() const; private: const_iterator(uint32_t rxFlags, uint8_t idx, uint8_t endIdx); /** * @brief Check if current RX queue has pending data. */ bool isRxPending() const; friend class CanPendingRxFifos; private: uint32_t rxFlags_; /**< RX flag bits */ uint8_t idx_; /**< Current flag index */ uint8_t endIdx_; /**< Iterator end index */ }; public: /** * @param rxFlags RX flag bits * @param numFifos Number of RX FIFOs */ CanPendingRxFifos(uint32_t rxFlags, uint8_t numFifos); const_iterator begin() const; const_iterator end() const; private: uint32_t rxFlags_; /**< RX flag bits */ uint8_t numFifos_; /**< Number of RX FIFOs */ }; } // namespace sta #endif // STA_CORE_CAN_ITER_HPP