namespace
{
/// Saca espacios de una palabra
- std::string strip(std::string s)
- {
- std::istringstream ss(s);
- ss >> s;
- return s;
+ std::string strip(std::string s) {
+ std::string ws = " \t\n";
+ int first = s.find_first_not_of(ws);
+ int last = s.find_last_not_of(ws);
+
+ if (first == -1) {
+ int pos_first = s.find_first_of(ws);
+ if (pos_first == -1) {
+ return s;
+ } else {
+ return std::string("");
+ }
+ }
+ return s.substr(first,last-first+1).c_str();
}
/// Devuelve palabra hasta el caracter indicado
return false;
Persona::sexo_type sexo = Persona::M;
Persona::sexo_type opuesto = Persona::F;
+
+ Susanita::size_type cap = get_n(filename);
+
std::string l;
while (std::getline(f, l))
{
Persona* pp = susanita.get_persona(nombre);
if (!pp)
{
- pp = new Persona(nombre, sexo);
+ pp = new Persona(nombre, sexo, cap);
susanita.add_persona(pp);
}
- Persona::prefs_type prefs;
+ int count = 0;
while (ss)
{
std::string nombre = get_hasta(ss, ',');
+ nombre = strip(nombre);
+ if (nombre.empty()) {
+ continue;
+ }
Persona* ppp = susanita.get_persona(nombre);
if (!ppp)
{
- ppp = new Persona(nombre, opuesto);
+ ppp = new Persona(nombre, opuesto, cap);
susanita.add_persona(ppp);
}
pp->prefs.push_back(ppp);
+ pp->prefs_hash[ppp->nombre] = count;
+ count++;
}
}
return true;
}
}
+/// Hack medio feo para obtener el N del problema
+Susanita::size_type
+Parser::
+get_n(const std::string& filename)
+{
+ std::ifstream f(filename.c_str());
+ if (!f)
+ return 0;
+ std::string l;
+ if (!std::getline(f, l))
+ return 0;
+ std::istringstream ss(strip(l));
+ // descartamos el nombre
+ get_hasta(ss, ':');
+ // contamos personas en la lista
+ Susanita::size_type count = 0;
+ while (ss)
+ {
+ if (!strip(get_hasta(ss, ',')).empty())
+ ++count;
+ }
+ return count;
+}
+