| Index: chrome/browser/sync/notifier/base/utils.h
|
| ===================================================================
|
| --- chrome/browser/sync/notifier/base/utils.h (revision 0)
|
| +++ chrome/browser/sync/notifier/base/utils.h (revision 0)
|
| @@ -0,0 +1,91 @@
|
| +// Copyright (c) 2009 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.
|
| +//
|
| +// Utility functions
|
| +
|
| +#ifndef CHROME_BROWSER_SYNC_NOTIFIER_BASE_UTILS_H_
|
| +#define CHROME_BROWSER_SYNC_NOTIFIER_BASE_UTILS_H_
|
| +
|
| +#include <map>
|
| +#include <string>
|
| +
|
| +#include "chrome/browser/sync/notifier/base/static_assert.h"
|
| +
|
| +// return error if the first argument evaluates to false
|
| +#define RET_IF_FALSE(x) do { if (!(x)) return false; } while (false)
|
| +
|
| +// Protocol constants
|
| +const char kHttpProto[] = "http://";
|
| +const char kHttpsProto[] = "https://";
|
| +
|
| +// Initialize a POD to zero.
|
| +// Using this function requires discipline. Don't use for types that have a
|
| +// v-table or virtual bases.
|
| +template <typename T>
|
| +inline void SetZero(T& p) {
|
| + // Guard against the easy mistake of
|
| + // foo(int *p) { SetZero(p); } instead of
|
| + // SetZero(*p);
|
| + // which it should be.
|
| + STATIC_ASSERT(sizeof(T) != sizeof(void*));
|
| +
|
| + // A POD (plain old data) object has one of these data types:
|
| + // a fundamental type, union, struct, array,
|
| + // or class--with no constructor. PODs don't have virtual functions or
|
| + // virtual bases.
|
| +
|
| + // Test to see if the type has constructors.
|
| + union CtorTest {
|
| + T t;
|
| + int i;
|
| + };
|
| +
|
| + // TODO(sync) There might be a way to test if the type has virtuals
|
| + // For now, if we zero a type with virtuals by mistake, it is going to crash
|
| + // predictable at run-time when the virtuals are called.
|
| + memset(&p, 0, sizeof(T));
|
| +}
|
| +
|
| +// Used to delete each element in a vector<T*>/deque<T*>
|
| +// (and then empty the sequence).
|
| +template <class T>
|
| +void CleanupSequence(T* items) {
|
| + for (typename T::iterator it(items->begin()); it != items->end(); ++it) {
|
| + delete (*it);
|
| + }
|
| + items->clear();
|
| +}
|
| +
|
| +// Typically used to clean up values used in a hash_map
|
| +// that had Type* as values.
|
| +//
|
| +// WARNING: This function assumes that T::clear will not access the values
|
| +// (or the keys if they are the same as the values). This is true
|
| +// for hash_map.
|
| +template <class T>
|
| +void CleanupMap(T* items) {
|
| + // This is likely slower than a for loop, but we have to do it this way. In
|
| + // some of the maps we use, deleting it->second causes it->first to be deleted
|
| + // as well, and that seems to send the iterator in a tizzy.
|
| + typename T::iterator it = items->begin();
|
| + while (it != items->end()) {
|
| + items->erase(it->first);
|
| + delete it->second;
|
| + it = items->begin();
|
| + }
|
| +}
|
| +
|
| +// Get the value of an element in the map with the specified name
|
| +template <class T>
|
| +void GetMapElement(const std::map<const std::string, const T>& m,
|
| + const char* name,
|
| + T* value) {
|
| + typename std::map<const std::string, const T>::const_iterator iter(
|
| + m.find(name));
|
| + if (iter != m.end()) {
|
| + *value = iter->second;
|
| + }
|
| +}
|
| +
|
| +#endif // CHROME_BROWSER_SYNC_NOTIFIER_BASE_UTILS_H_
|
|
|
| Property changes on: chrome\browser\sync\notifier\base\utils.h
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|