Device interface library for multiple platforms including Mbed.
Dependents: DeepCover Embedded Security in IoT MaximInterface MAXREFDES155#
Maxim Interface is a library framework focused on providing flexible and expressive hardware interfaces. Both communication interfaces such as I2C and 1-Wire and device interfaces such as DS18B20 are supported. Modern C++ concepts are used extensively while keeping compatibility with C++98/C++03 and requiring no external dependencies. The embedded-friendly design does not depend on exceptions or RTTI.
The full version of the project is hosted on GitLab: https://gitlab.com/iabenz/MaximInterface
Diff: Utilities/Segment.hpp
- Revision:
- 7:9cd16581b578
- Parent:
- 6:471901a04573
- Child:
- 8:5ea891c7d1a1
--- a/Utilities/Segment.hpp Mon Mar 04 08:10:00 2019 -0600 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,135 +0,0 @@ -/******************************************************************************* -* Copyright (C) 2017 Maxim Integrated Products, Inc., All Rights Reserved. -* -* Permission is hereby granted, free of charge, to any person obtaining a -* copy of this software and associated documentation files (the "Software"), -* to deal in the Software without restriction, including without limitation -* the rights to use, copy, modify, merge, publish, distribute, sublicense, -* and/or sell copies of the Software, and to permit persons to whom the -* Software is furnished to do so, subject to the following conditions: -* -* The above copyright notice and this permission notice shall be included -* in all copies or substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -* IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES -* OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -* OTHER DEALINGS IN THE SOFTWARE. -* -* Except as contained in this notice, the name of Maxim Integrated -* Products, Inc. shall not be used except as stated in the Maxim Integrated -* Products, Inc. Branding Policy. -* -* The mere transfer of this software does not imply any licenses -* of trade secrets, proprietary technology, copyrights, patents, -* trademarks, maskwork rights, or any other form of intellectual -* property whatsoever. Maxim Integrated Products, Inc. retains all -* ownership rights. -*******************************************************************************/ - -#ifndef MaximInterface_Segment -#define MaximInterface_Segment - -#include <iterator> -#include <utility> -#include "type_traits.hpp" - -namespace MaximInterface { - -/// @brief -/// Advances a given iterator by a given number of elements with bounds checking. -/// @tparam InputIt Must meet the requirements of InputIterator. -/// @param[in,out] it Iterator to advance. -/// @param bound -/// Past-the-end boundary iterator. If distance is positive, bound must be -/// reachable by incrementing the given iterator. If distance is negative, bound -/// must be reachable by decrementing the given iterator. -/// @param distance -/// Number of elements to advance the given iterator. If distance is positive, -/// the given iterator is incremented. If distance is negative, the given -/// iterator is decremented, and InputIt must meet the requirements of -/// BidirectionalIterator. -/// @returns The number of elements that the given iterator was advanced. -template <typename InputIt> -typename std::iterator_traits<InputIt>::difference_type checkedAdvance( - InputIt & it, const InputIt bound, - typename std::iterator_traits<InputIt>::difference_type distance) { - typedef - typename std::iterator_traits<InputIt>::difference_type difference_type; - - // Use constant-time operations if InputIt is a random access iterator. - if (is_same<typename std::iterator_traits<InputIt>::iterator_category, - std::random_access_iterator_tag>::value) { - const difference_type boundDistance = std::distance(it, bound); - if (boundDistance >= 0) { - if (distance > boundDistance) { - distance = boundDistance; - } else if (distance < 0) { - distance = 0; - } - } else { - if (distance < boundDistance) { - distance = boundDistance; - } else if (distance > 0) { - distance = 0; - } - } - std::advance(it, distance); - } else { - const difference_type startingDistance = distance; - while (distance != 0 && it != bound) { - if (distance > 0) { - ++it; - --distance; - } else { - --it; - ++distance; - } - } - if (startingDistance > 0) { - distance = startingDistance - distance; - } else { - distance = startingDistance + distance; - } - } - return distance; -} - -/// @brief Locates an iterator sub-range using segment number addressing. -/// @details -/// Useful for devices that divide the memory space into uniform chunks such as -/// pages and segments. -/// @tparam ForwardIt Must meet the requirements of ForwardIterator. -/// @param begin Beginning of the input data range. -/// @param end End of the input data range. -/// @param segmentSize Number of elements contained in a segment. -/// @param segmentNum Zero-indexed number of the desired segment. -/// @returns -/// Pair of iterators representing the sub-range of the segment within -/// the input range. If the segment does not exist within the input range, both -/// iterators in the pair are set to the end iterator of the input range. -template <typename ForwardIt, typename Index> -std::pair<ForwardIt, ForwardIt> createSegment( - ForwardIt begin, const ForwardIt end, - const typename std::iterator_traits<ForwardIt>::difference_type segmentSize, - Index segmentNum) { - ForwardIt segmentEnd = begin; - typename std::iterator_traits<ForwardIt>::difference_type lastSegmentSize = - checkedAdvance(segmentEnd, end, segmentSize); - while (segmentNum > 0 && segmentEnd != end) { - begin = segmentEnd; - lastSegmentSize = checkedAdvance(segmentEnd, end, segmentSize); - --segmentNum; - } - if (segmentNum > 0 || lastSegmentSize != segmentSize) { - begin = segmentEnd; - } - return std::make_pair(begin, segmentEnd); -} - -} // namespace MaximInterface - -#endif \ No newline at end of file