109 lines
2.9 KiB
C++
109 lines
2.9 KiB
C++
// Copyright (C) 2013 Davis E. King (davis@dlib.net)
|
|
// License: Boost Software License See LICENSE.txt for the full license.
|
|
#ifndef DLIB_MATRIx_READ_FROM_ISTREAM_H_h_
|
|
#define DLIB_MATRIx_READ_FROM_ISTREAM_H_h_
|
|
|
|
#include "matrix.h"
|
|
#include <vector>
|
|
#include <iostream>
|
|
|
|
namespace dlib
|
|
{
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
namespace impl
|
|
{
|
|
inline bool next_is_whitespace (
|
|
std::istream& in
|
|
)
|
|
{
|
|
return in.peek() == '\n' ||
|
|
in.peek() == ' ' ||
|
|
in.peek() == ',' ||
|
|
in.peek() == '\t' ||
|
|
in.peek() == '\r';
|
|
}
|
|
}
|
|
|
|
template <typename T, long NR, long NC, typename MM, typename L>
|
|
std::istream& operator>> (
|
|
std::istream& in,
|
|
matrix<T,NR,NC,MM,L>& m
|
|
)
|
|
{
|
|
using namespace dlib::impl;
|
|
long num_rows = 0;
|
|
std::vector<T> buf;
|
|
buf.reserve(100);
|
|
|
|
// eat any leading whitespace
|
|
while (next_is_whitespace(in))
|
|
in.get();
|
|
|
|
bool at_start_of_line = true;
|
|
bool stop = false;
|
|
while(!stop && in.peek() != EOF)
|
|
{
|
|
T temp;
|
|
in >> temp;
|
|
if (!in)
|
|
return in;
|
|
|
|
buf.push_back(temp);
|
|
if (at_start_of_line)
|
|
{
|
|
at_start_of_line = false;
|
|
++num_rows;
|
|
}
|
|
|
|
// Eat next block of whitespace but also note if we hit the start of the next
|
|
// line.
|
|
while (next_is_whitespace(in))
|
|
{
|
|
if (at_start_of_line && in.peek() == '\n')
|
|
{
|
|
stop = true;
|
|
break;
|
|
}
|
|
|
|
if (in.get() == '\n')
|
|
at_start_of_line = true;
|
|
}
|
|
}
|
|
|
|
// It's an error for there to not be any matrix data in the input stream
|
|
if (num_rows == 0)
|
|
{
|
|
in.clear(in.rdstate() | std::ios::failbit);
|
|
return in;
|
|
}
|
|
|
|
const long num_cols = buf.size()/num_rows;
|
|
// It's also an error if the sizes don't make sense.
|
|
if (num_rows*num_cols != (long)buf.size() ||
|
|
(NR != 0 && NR != num_rows) ||
|
|
(NC != 0 && NC != num_cols))
|
|
{
|
|
in.clear(in.rdstate() | std::ios::failbit);
|
|
return in;
|
|
}
|
|
|
|
|
|
m = reshape(mat(buf),num_rows, buf.size()/num_rows);
|
|
|
|
if (in.eof())
|
|
{
|
|
// Clear the eof and fail bits since this is caused by peeking at the EOF.
|
|
// But in the current case, we have successfully read the matrix.
|
|
in.clear(in.rdstate() & (~(std::ios::eofbit | std::ios::failbit)));
|
|
}
|
|
return in;
|
|
}
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
#endif // DLIB_MATRIx_READ_FROM_ISTREAM_H_h_
|
|
|