// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// Various utilities for dealing with invalidation data types.

#ifndef SYNC_INTERNAL_API_PUBLIC_BASE_INVALIDATION_UTIL_H_
#define SYNC_INTERNAL_API_PUBLIC_BASE_INVALIDATION_UTIL_H_

#include <iosfwd>
#include <map>
#include <set>
#include <string>

#include "base/memory/scoped_ptr.h"
#include "sync/base/sync_export.h"
#include "sync/internal_api/public/base/model_type.h"

namespace base {
class DictionaryValue;
}  // namespace

namespace invalidation {

class Invalidation;
class ObjectId;

// Gmock print helper
SYNC_EXPORT_PRIVATE void PrintTo(const invalidation::ObjectId& id,
                                 std::ostream* os);

}  // namespace invalidation

namespace syncer {

class Invalidation;

struct SYNC_EXPORT ObjectIdLessThan {
  bool operator()(const invalidation::ObjectId& lhs,
                  const invalidation::ObjectId& rhs) const;
};

struct SYNC_EXPORT InvalidationVersionLessThan {
  bool operator()(const syncer::Invalidation& a,
                  const syncer::Invalidation& b) const;
};

typedef std::set<invalidation::ObjectId, ObjectIdLessThan> ObjectIdSet;

typedef std::map<invalidation::ObjectId, int, ObjectIdLessThan>
    ObjectIdCountMap;

SYNC_EXPORT bool RealModelTypeToObjectId(ModelType model_type,
                                         invalidation::ObjectId* object_id);

bool ObjectIdToRealModelType(const invalidation::ObjectId& object_id,
                             ModelType* model_type);

// Caller owns the returned DictionaryValue.
scoped_ptr<base::DictionaryValue> ObjectIdToValue(
    const invalidation::ObjectId& object_id);

bool ObjectIdFromValue(const base::DictionaryValue& value,
                       invalidation::ObjectId* out);

SYNC_EXPORT_PRIVATE std::string ObjectIdToString(
    const invalidation::ObjectId& object_id);

SYNC_EXPORT_PRIVATE ObjectIdSet ModelTypeSetToObjectIdSet(ModelTypeSet models);
ModelTypeSet ObjectIdSetToModelTypeSet(const ObjectIdSet& ids);

std::string InvalidationToString(
    const invalidation::Invalidation& invalidation);

}  // namespace syncer

#endif  // SYNC_INTERNAL_API_PUBLIC_BASE_INVALIDATION_UTIL_H_
