| // This file is part of the ustl library, an STL implementation. |
| // |
| // Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net> |
| // This file is free software, distributed under the MIT License. |
| // |
| // memlink.cc |
| // |
| // A pointer to a sized block of memory. |
| // |
| |
| #include "mistream.h" |
| #include "uassert.h" |
| #include "ustdxept.h" |
| |
| #if PLATFORM_ANDROID |
| #include <stdio.h> |
| #endif |
| |
| namespace ustl { |
| |
| /// Reads the object from stream \p s |
| void memlink::read (istream& is) |
| { |
| written_size_type n; |
| is >> n; |
| is.verify_remaining ("read", "ustl::memlink", n); |
| if (n > size()) |
| #if PLATFORM_ANDROID |
| printf("length error\n"); |
| #else |
| throw length_error ("memlink can not increase the size of the linked storage for reading"); |
| #endif |
| resize (n); |
| is.read (data(), n); |
| is.align (alignof (n)); |
| } |
| |
| /// Copies data from \p p, \p n to the linked block starting at \p start. |
| void memlink::copy (iterator start, const void* p, size_type n) |
| { |
| assert (data() || !n); |
| assert (p || !n); |
| assert (start >= begin() && start + n <= end()); |
| if (p) |
| copy_n (const_iterator(p), n, start); |
| } |
| |
| /// Fills the linked block with the given pattern. |
| /// \arg start Offset at which to start filling the linked block |
| /// \arg p Pointer to the pattern. |
| /// \arg elSize Size of the pattern. |
| /// \arg elCount Number of times to write the pattern. |
| /// Total number of bytes written is \p elSize * \p elCount. |
| /// |
| void memlink::fill (iterator start, const void* p, size_type elSize, size_type elCount) |
| { |
| assert (data() || !elCount || !elSize); |
| assert (start >= begin() && start + elSize * elCount <= end()); |
| if (elSize == 1) |
| fill_n (start, elCount, *reinterpret_cast<const uint8_t*>(p)); |
| else while (elCount--) |
| start = copy_n (const_iterator(p), elSize, start); |
| } |
| |
| } // namespace ustl |
| |