#include <iostream>
#include <vector>
#include <set>

using namespace std;
struct PasswordFormData {
  const char* signon_realm;
};

struct PasswordForm {
  std::string signon_realm;
  PasswordForm();
  ~PasswordForm();
};


PasswordForm::PasswordForm(){
}

PasswordForm::~PasswordForm() {
}

PasswordForm* CreatePasswordFormFromData(
    const PasswordFormData& form_data) {
  PasswordForm* form = new PasswordForm();
  if (form_data.signon_realm) {
    form->signon_realm = "http://foo.example.com";
  }
  return form;
}

typedef std::set<const PasswordForm*> SetOfForms;

int main()
{
  static const PasswordFormData form_data[] = {
      { "http://foo.example.com"},
    };
  std::vector<PasswordForm*> vector1;
  for (int i = 0; i < sizeof(form_data)/sizeof(form_data[0]); ++i) {
    PasswordForm* form = CreatePasswordFormFromData(form_data[i]);
    vector1.push_back(form);
  }

#if BUG
  SetOfForms set1(vector1.begin(), vector1.end());
#else
  SetOfForms set1;
  std::copy(vector1.begin(), vector1.end(), std::inserter(set1, set1.begin()));
#endif   
  for(std::vector<PasswordForm*>::iterator iter = vector1.begin(); iter != vector1.end(); ++iter) {
    const PasswordForm* value = *iter;
    cout << "************************************************ vector value " << value->signon_realm << std::endl;
  }
  cout<<"******************************************** set size "<< set1.size() << std::endl;
  for(SetOfForms::iterator iter = set1.begin(); iter != set1.end(); ++iter) {
    const PasswordForm* value = *iter;
    cout << "************************************************ set value " << value << std::endl;
    cout << "************************************************ set value " << value->signon_realm << std::endl;
  }
    return 0;
}
